2012-02-04 19 views
2

私はLinq経由でデカルト積(A×A)を作っており、反射要素を取り除くことはかなり簡単です(a != b)が、私はsymmtric要素と闘う。助言がありますか? THXLinqからSymmetryをCartesian製品から削除するには?

from var a in Stuff 
from var b in Stuff 
where a != b 
where // Remove symmetric Elements 
select new { A = a, B = b} 

このクエリは再帰要素なしStuff上cartesion生成物を含有する((A)、(B、B)など)。それでも、(a、b)と(b、a))の中には、象徴的な要素が残っています。

答えて

2

あなたは、インデックスの要素のインデックスを保持し、その後、参加ごクロス対称要素を削除するためにインデックスを使用匿名型に投影することによって、あなたのソース列挙できましたどのソース列挙体でも機能するという利点は、項目は比較可能である必要はありません。

+0

ええ...それはきちんとした、小さなトリック... Thx a lot –

2

1つの選択肢は、最初に最大の要素を含む結果のみを選択することです。

var IndexedStuff = Stuff.Select((item,index) => new { Item = item, Index = index}); 
var result = (from a in IndexedStuff 
       from b in IndexedStuff 
       where a.Index < b.Index 
       select new { A = a.Item, B = b.Item }); 

これは持っている:

where a > b // Remove symmetric Elements 
+0

でも動作しますが、 '>'は 'Stuff'で定義されていません。 –

+0

@MarcelBenthinは、 'a.CompareTo(b)'が定義されていますか? –

+0

しかし、私はおそらくそのための任意の定義を構成することができます。 Thx –

0
from var a in Stuff 
from var b in Stuff 
where a < b 
select new { A = a, B = b} 
関連する問題