如何使用linQ访问列表中的上一个项目?

时间:2010-12-16 11:09:54

标签: c# linq

我的列表A包含{1,2,3,4,5,6}

List<int> m=new List<int>();
for(int i=1;i<A.count;i++)
{
int j=A[i]+A[i-1];
m.add(j);
}

如何使用LinQ执行相同的操作?

5 个答案:

答案 0 :(得分:35)

嗯,简单的翻译就是:

var m = Enumerable.Range(1, A.Count - 1)
                  .Select(i => A[i] + A[i - 1])
                  .ToList();

但也要考虑:

var m = A.Skip(1)
         .Zip(A, (curr, prev) => curr + prev)
         .ToList();

或使用Jon Skeet的分机here

var m = A.SelectWithPrevious((prev, curr) => prev + curr)
         .ToList();

但正如Jason Evans在评论中指出的那样,考虑到您现有的代码完全可以理解(并且简短)并且您希望实现所有,这对可读性或简洁性没有多大帮助。无论如何,将结果列入清单。

没有什么不对的:

var sumsOfConsecutives = new List<int>();

for(int i = 1; i < A.Count; i++)
   sumsOfConsecutives.Add(A[i] + A[i - 1]);

答案 1 :(得分:13)

好的,你可以使用列表中的Next项:

A.SkipWhile(x => x != value).Skip(1).FirstOrDefault();

所以要使用上一项:

var B = A.ToList();
B.Reverse();
B.SkipWhile(x => x != value).Skip(1).FirstOrDefault();

答案 2 :(得分:3)

这样的东西
var l = A.Skip(1).Select((x, index) => x + A[index]).ToList();

答案 3 :(得分:3)

其他一些答案假设A的元素总是为1,2,3,4,5,6。如果这些值发生变化,则解决方案会中断,例如值变为2, 3,6,7,10。

这是我的解决方案,适用于任何A值。

List<int> m = A.Skip(1).Select((element, index) => element + A.ElementAt(index)).ToList();

值得注意的是,坚持使用循环可能比为此解决Linq解决方案更好。

答案 4 :(得分:1)

如果您只需要结束值,您可以聚合它,即。您需要以前的值,但不需要将每个值都添加到新列表中。

int last = 0;
var r = m.Aggregate(last, (acc, it) => (last += it), (acc) => (last));