C# 如何通过Linq消除笛卡尔积的对称性?

C# 如何通过Linq消除笛卡尔积的对称性?,c#,.net,linq,C#,.net,Linq,我已经通过Linq合成了一个笛卡尔积(a×a),移除自反元素非常容易(a!=b),但我很难处理对称元素。有什么建议吗?Thx 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,a),(b,b)等等)。对称元素仍在其中((a,b)和(b,a))。一种

我已经通过Linq合成了一个笛卡尔积(a×a),移除自反元素非常容易(
a!=b
),但我很难处理对称元素。有什么建议吗?Thx

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,a),(b,b)等等)。对称元素仍在其中((a,b)和(b,a))。

一种替代方法是只首先选取最大元素的结果

where a > b // Remove symmetric Elements

一种替代方法是只首先选择具有最大元素的结果

where a > b // Remove symmetric Elements

您可以通过投影到保留元素索引的匿名类型来索引源枚举,然后使用该索引删除交叉联接中的对称元素:

 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 });
var IndexedStuff=Stuff.Select((item,index)=>new{item=item,index=index});
变量结果=(来自IndexedStuff中的
从IndexedStuff中的b开始
其中a.索引

这样做的优点是它适用于任何源枚举,项不需要具有可比性。

您可以通过投影到保留元素索引的匿名类型来为源枚举编制索引,然后使用索引删除交叉联接中的对称元素:

 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 });
from var a in Stuff 
from var b in Stuff 
where a < b 
select new { A = a, B = b} 
var IndexedStuff=Stuff.Select((item,index)=>new{item=item,index=index});
变量结果=(来自IndexedStuff中的
从IndexedStuff中的b开始
其中a.索引
这有一个优点,它适用于任何源枚举,项不需要具有可比性。

来自Stuff中的VarA
from var a in Stuff 
from var b in Stuff 
where a < b 
select new { A = a, B = b} 
来自Stuff中的VarB 其中a
来自Stuff中的var a
来自Stuff中的VarB
其中a
@MarcelBenthin,a.CompareTo(b)定义了吗?但我可能可以为它编一个任意的定义。Thx
a
与a的索引a.CompareTo(b)定义了吗?但我可能可以为它编一个任意的定义。Thx
a
与a的索引不同