LINQ中的高效列表自我比较?

E.B*_*ach 7 c# linq

这可能与此问题非常相似,但我想知道在C#和LINQ中最有效的方法是在同一列表中比较元素列表.

例如,在伪代码中我想这样做:

foreach(i in list)    
    foreach(j in list.Except(i))    
        Compare(j,i)
Run Code Online (Sandbox Code Playgroud)

我知道Except采用了一个可枚举而不是单个项目,可能不是最好的主意,但它应该说明我的意图.

有任何想法吗?

更新:

我想这个问题有点模糊.目标是迭代列表两次(使用LINQ),同时跳过该对(i, i); 无论Compare(i,j)实际做什么与我的问题无关.

有2箱子然后,一个地方(i,j) == (j,i)(i,j) != (j,i).对于前者,乔治·达克特(George Duckett)在下面的跳过解决方案可以解决这个问题,但后者呢?这是我原来使用的除进来,这样既(i,j)(j,i)将进行评估.

所以要澄清一下,有没有更好的方法来跳过列表中的元素,而不是list.Except(Enumerable.Repeat(i,1))

Geo*_*ett 8

这将给你所有对,假设对的顺序无关紧要(Compare(i, j) == Compare(j, i)):

var test = from i in list
           from j in list.SkipWhile(j => j != i)
           where i != j // Remove the self-comparison if you want to
           select Compare(i, j);
Run Code Online (Sandbox Code Playgroud)


pst*_*jds 4

我不知道你对LINQ有没有要求,但是我很可能会这样写这段代码,这样当我3周后回顾代码时,一看就知道是怎么回事。

for(var i = 0; i < list.Count; ++i)
{
    var item = list[i];
    for(var j = i+1; j < list.Count; ++j)
    {
        Compare(item, list[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你仍然想使用一些 LINQ,你可以这样重写:

for(var i = 0; i < list.Count; ++i)
{
    var item = list[i];
    foreach(var j in list.Skip(i+1))
    {
        Compare(item, j);
    }
}
Run Code Online (Sandbox Code Playgroud)