C# 如何通过Linq消除笛卡尔积的对称性?
我已经通过Linq合成了一个笛卡尔积(a×a),移除自反元素非常容易(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))。一种
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)定义了吗?但我可能可以为它编一个任意的定义。Thxa
与a的索引a.CompareTo(b)
定义了吗?但我可能可以为它编一个任意的定义。Thxa
与a的索引不同