C# LINQ中的高效列表自比较?

C# LINQ中的高效列表自比较?,c#,linq,C#,Linq,这可能与此非常相似,但我想知道在C#和LINQ中比较同一列表中元素列表的最有效方法 例如,在伪代码中,我想这样做: foreach(i in list) foreach(j in list.Except(i)) Compare(j,i) 我知道,Except采用可枚举项而不是单个项,可能不是最好的主意,但它应该说明我的意图 有什么想法吗 更新: 我想这个问题有点模糊。目标是在一个列表上迭代两次(使用LINQ),同时跳过该对(i,i);无论比较(i,j)实

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

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

foreach(i in list)    
    foreach(j in list.Except(i))    
        Compare(j,i)
我知道,Except采用可枚举项而不是单个项,可能不是最好的主意,但它应该说明我的意图

有什么想法吗

更新:

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

有两种情况,一种是
(i,j)=(j,i)
(i,j)!=(j,i)
。对于前者,乔治·达克特(George Duckett)下面的“滑雪”解决方案确实奏效,但后者呢?这就是我最初使用Except的地方,以便对
(i,j)
(j,i)
进行评估


因此,澄清一下,除了
列表之外,还有没有更好的方法跳过列表中的元素。除了(Enumerable.Repeat(i,1))

我不知道您是否需要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]);
    }
}
for(变量i=0;i
如果仍要使用某些LINQ,可以这样重写:

for(var i = 0; i < list.Count; ++i)
{
    var item = list[i];
    foreach(var j in list.Skip(i+1))
    {
        Compare(item, j);
    }
}
for(变量i=0;i
这将为您提供所有对,假设对的顺序无关紧要(
比较(i,j)=比较(j,i)
):


您的需求需要更多说明,但这可以帮助您:

List<int> list = new List<int>() { 1, 2, 3, 4 };
var result = list.Aggregate((p, q) => p.CompareTo(q) > 0 ? p : q);//Return 4
List List=newlist(){1,2,3,4};
var结果=列表聚合((p,q)=>p.CompareTo(q)>0?p:q)//返回4

您的问题对于如何处理比较结果有点模糊,但这里有一个想法:

public static IEnumerable<TResult> Compare<T, TResult>(this IEnumerable<T> source,  Func<T, T, TResult> func)
{
    int i = 0;
    foreach (T item1 in source)
    {
        foreach (T item2 in source.Skip(i))
            yield return func(item1, item2);
        i++;
    }
}
您可以这样做:

var compared = list.Compare((item1, item2) => item1.Equals(item2));
//compared will be IEnumerable<bool> in this case

请注意:LINQ和efficient不能很好地协同工作。您打算如何处理比较结果,因为这可能需要某些方法。另外,请定义所需的“高效”。当它进行比较时,您希望它做什么,是否应该在比较返回false时立即返回,等等?您的伪代码没有多大意义。这一切的结果应该是什么?也许举个例子会有帮助。@Shai:请注意:编码和对效率进行毫无根据的陈述不能很好地结合在一起。我喜欢这段代码的简洁性,但Linq版本可能会因为
.Skip()而性能不佳
method:@pstrjds我现在实际上正在使用它的一个变体来加速一些不必要的逻辑复制。这节省了我很多处理时间,所以干杯!
List<string> list = new List<string> { "test", "hello", "foo", "bar" };
var compared = list.Compare((item1, item2) => item1.Equals(item2));
//compared will be IEnumerable<bool> in this case
var compared = list.Compare((item1, item2) => new { item1, item2 });
//to get an enumerator of all the different comparisons of the 2 lists