0

私はこのクラスを持っています

public class Line
{
  public string ConnectionsIndex{get;set;}
}

私のLinqの問題は、これらの行を集約する必要があることです

var l1 = new Line{ ConnectionsIndex="01,02"};
var l2 = new Line{ ConnectionsIndex="02,03"};
var l3 = new Line{ ConnectionsIndex="01,03"};

これに

var l4 = new Line{ ConnectionsIndex="01,02,03"};

Linqでできることはありますか?

詳細:

コレクションに他のアイテムを追加すると、事態はさらに複雑になります (少なくとも私にとっては)。

var l5 = new Line (ConnectionsIndex = "02,04"); 
var l6 = new Line (ConnectionsIndex = "03,06"); 

ペア 03,04 、 01,04 、 01,06 、および 02,06 を持つ他の行が存在しないため

うまく説明できたかわかりませんが…

実際には、ポリゴンのすべてのポイントがあると想像してください。各ポリゴンのすべてのポイント間の接続のリストを提供することにより、クエリからすべてのアイテムの行を取得したいと考えています。

(私のリストには複数のポリゴンが含まれています)

他のすべてに接続されていない場合、1 つのポイントを結果に含めないでください。

これは私のリストの内容の例です:

ConnectionsIndex="166,171"
ConnectionsIndex="166,174"
ConnectionsIndex="166,333"
ConnectionsIndex="169,170"
ConnectionsIndex="171,175"
ConnectionsIndex="171,334"
ConnectionsIndex="167,174"
ConnectionsIndex="172,174"
ConnectionsIndex="174,335"
ConnectionsIndex="177,341"
ConnectionsIndex="180,200"
ConnectionsIndex="181,183"
ConnectionsIndex="182,199"
ConnectionsIndex="184,185"
ConnectionsIndex="186,188"
ConnectionsIndex="189,192"
ConnectionsIndex="190,230"
ConnectionsIndex="191,375"

このリストには、たとえば、166、171、および 334 の間の三角形があります。

もっと詳しく:

var group = lines.Where(x => x.ConnectionsIndex.Split(',').Contains(line.ConnectionsIndex.Split(',')[0]) || x.ConnectionsIndex.Split(','). Contains(line.ConnectionsIndex.Split(',')[1])).ToList(); if (group.Count()==1) { Straight_lines.Add(line); } else { //ここに、ポイント間のすべての行を含む「グループ」があります..個別のポイントを取得したい }

4

4 に答える 4

1

何かのようなもの:

var connections = (from line in lines
                   from connection in line.Split(',')
                   select connection).Distinct()
                                     .ToArray();

Line line = new Line { ConnectionsIndex = string.Join(",", connections) };

これは接続を順序付けしませんが、必要に応じて簡単に追加できます。

ConnectionsIndexもちろん、区切られた単一の文字列の代わりに文字列のコレクションとして喜んで持っていれば、これはすべてき​​れいになります:)

于 2009-09-03T10:25:38.723 に答える
0

これは私が見つけた悪い方法です...そしてそれはうまくいきます!

var l = linee.Distinct(
            (a, b) => a.ConnectionsIndex == b.ConnectionsIndex,x=>x.ConnectionsIndex.GetHashCode())
        .ToList();

    var single_lines = new List<Linea>();
    var multiple_lines = new List<Linea>();
    foreach (var linea in l)
    {
        var group = l
            .Where(x => x.ConnectionsIndex.Split(',').Contains(linea.ConnectionsIndex.Split(',')[0]) ||
                x.ConnectionsIndex.Split(',').Contains(linea.ConnectionsIndex.Split(',')[1])).ToList();
        if (group.Count()==1)
        {
            single_lines.Add(linea);
        }
        else
        {
            var indexes = new List<string>();
            var dist = group.Select(x => new {Index = x.ConnectionsIndex.Split(',').ToList()}).ToList();    

            foreach (var linea1 in dist)
            {
        indexes=indexes.Concat(linea1.Index).ToList();
            }

            var indexstring = new StringBuilder();
            foreach (var s in indexes.Distinct().OrderBy(x=>Convert.ToInt32(x)))
            {
        indexstring.Append(s).Append(',');
            }
            indexstring.Remove(indexstring.Length - 1, 1);
            multiple_lines.Add(new Linea() {ConnectionsIndex = indexstring.ToString()});
        }
    }

var multi_distinct=multiple_lines.Distinct(
            (a, b) => a.ConnectionsIndex == b.ConnectionsIndex, x => x.ConnectionsIndex.GetHashCode())
            .ToList();

linee = single_lines.Concat(multi_distinct).ToList();

より良い解決策を見つけたり知ったりした場合は、大歓迎です!

于 2009-09-03T13:38:31.640 に答える
0

あなたが求めているのは、最大クリーク(グラフ理論の概念)を見つける方法だと思うことに注意してください。これは NP 困難な問題として知られています。あなたのバージョンは時々うまくいくと思いますが、あなたが興味を持っている場合にはうまくいくことを願っています。実際、多数のノードがある場合、(LINQ に関係なく) 大きな CPU サイクル バジェットがあっても、これらのケースは実行できません。

于 2009-12-02T17:27:08.737 に答える
0

私はこれを使用しました:

var l4 = new Line{ 
    ConnectionsIndex = 
        string.Join(",", (lines.SelectMany(x => x.ConnectionsIndex.Split(','))
                               .Distinct()
                               .OrderBy(s => s)).ToArray())
};
于 2009-09-03T10:38:18.957 に答える