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

rat*_*tty 16 c# linq

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

List<int> A  = new List<int>(){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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ani*_*Ani 38

那么,直接的翻译将是:

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

但也要考虑:

var m = A.Skip(1)
         .Zip(A, (curr, prev) => curr + prev)
         .ToList();
Run Code Online (Sandbox Code Playgroud)

或者在这里使用Jon Skeet的扩展:

var m = A.SelectWithPrevious((prev, curr) => prev + curr)
         .ToList();
Run Code Online (Sandbox Code Playgroud)

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

没有什么不对的:

var sumsOfConsecutives = new List<int>();

for(int i = 1; i < A.Count; i++)
   sumsOfConsecutives.Add(A[i] + A[i - 1]);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的.Zip()解决方案。很干净,您只读取2x数组。 (2认同)

小智 13

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

A.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

所以要使用上一个项目:

var B = A.ToList();
B.Reverse();
B.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)