2009-09-03 11 views
0

私はLINQクエリは

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

私のLINQの問題は、私はこの

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

にこれらの行

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

を集約しなければならないということである。このクラスを持っていることは何をすることが可能ですLinqと?

詳細:私は私のコレクションを持っている他の項目を追加するとき

事は(少なくとも私にとっては)もっと複雑です。私はそれをよく説明してきた場合、私は知らないペア03,04、01,04、01,06及び02,06

で他の行が存在しないため

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

...

実際には、ポリゴンのすべての点があるとします。各ポリゴンのすべての点の間の接続のリストを与えることで、クエリのすべての項目の行を取得したいと考えています。

(私のリストに複数のポリゴンが含まれている)他のすべてに接続されていない場合

ワンポイントが結果に含まれてはなりません。

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

あなたが例えば166、171および334

もっと詳しく間の三角形を持っているこのリストに

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" 

VARグループ=行コネクションインデックス( "、 ')。含まれています(行のConnectionsIndex.Split('、 ')[0])|| x。ConnectionsIndex.Split('、 ')。 。ConnectionsIndex.Split( '、')[1]))。ToList(); if(group.Count()== 1) { straight_lines.Add(line);他 } ここ { //私はポイント間のすべての行で "グループ" を持っている..私はdistincポイントに }

+0

ええと...私はまだあなたがしようとしていることを理解していないのですか?あなたは、入力の集まりと望ましい出力のいくつかの例(3または4)を教えてください。 –

+0

私は何か試しましたが、サンプルデータでは "166,171,174,333,175,334,167,172,335"と表示されます。あなたは正確なポリゴンを決定する必要がありますか? – Botz3000

+0

私は、より詳細が必要であることに同意します。あなたの値は「x、y」の座標であり、接続されたすべての点を1つの線で結ぶことを試みていますか? – MattH

答えて

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(); 

もっと良い解決策が見つかった場合やご存知の方は、歓迎します!

1

を取得したいような何か:

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

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

これにはありません接続を注文することができますが、必要に応じて簡単に追加できます。

あなたはもちろん:)私はこれを使用し

+0

NHibernateで簡単に保存するためには、単一の区切り文字列の形にしなければなりません...あなたのヒントをすぐにチェックします。 –

+0

申し訳ありませんが、正しい答えではありません...質問を編集して詳細を追加する必要があります。 –

0

の代わりに、単一の区切り文字列の文字列のコレクションとしてConnectionsIndexを持って幸せだった場合、これはすべてのクリーナーのようになります。

var l4 = new Line{ 
    ConnectionsIndex = 
     string.Join(",", (lines.SelectMany(x => x.ConnectionsIndex.Split(',')) 
           .Distinct() 
           .OrderBy(s => s)).ToArray()) 
}; 
+0

申し訳ありませんが、Jon Skeetと同じ結果を返します。 –

0

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