2012-02-04 76 views
2

我已經通過Linq組成了一個笛卡爾產品(A×A),並且去除反射元素非常容易(a != b),但我與對稱元素鬥爭。有什麼建議麼? THX如何通過Linq從笛卡爾產品中刪除對稱?

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

此查詢包含笛卡爾乘積超過Stuff而不自反元件((A,A),(B,B)等)。這些元素仍然在((a,b)和(b,a))中。

回答

2

你可以指數投射到保持元素的索引,然後使用索引來消除你的十字架對稱元素加入一個匿名類型源枚舉:

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

這有它可以在任何源枚舉上工作的優點,項目不需要具有可比性。

+0

是的......這是一個整潔,小動作...... Thx很多 – 2012-02-04 19:16:45

2

一種替代方法是首先選擇最大元素的結果。

where a > b // Remove symmetric Elements 
+0

可以工作,但'''沒有在'Stuff'上定義。 – 2012-02-04 19:09:40

+0

@MarcelBenthin,是否定義了「a.CompareTo(b)」? – 2012-02-04 19:11:32

+0

但我可以爲此構成一個任意的定義。 Thx – 2012-02-04 19:12:34

0
from var a in Stuff 
from var b in Stuff 
where a < b 
select new { A = a, B = b}