2012-02-04 74 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}