这可能与此问题非常相似,但我想知道在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))?
这将给你所有对,假设对的顺序无关紧要(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)
我不知道你对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)
| 归档时间: |
|
| 查看次数: |
6844 次 |
| 最近记录: |