C# LINQ中的高效列表自比较?
这可能与此非常相似,但我想知道在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)实
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