Select every second element from array using lambda

l33*_*33t 10 c# linq lambda

C# 4.0. How can the following be done using lambda expressions?

int[] a = new int[8] { 0, 1, 2, 3, 4, 5, 6, 7 };
// Now fetch every second element so that we get { 0, 2, 4, 6 }
Run Code Online (Sandbox Code Playgroud)

Asi*_*taq 24

int[] list = a.Where((value, index) => index % 2 == 0)
              .ToArray();
Run Code Online (Sandbox Code Playgroud)

它只会选择偶数索引,由%(mod)运算符计算.

5 % 2 // returns 1
4 % 2 // returns 0
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

%运营商


cuo*_*gle 11

另一种方法使用 Enumerable.Range

var result = Enumerable.Range(0, a.Length/2)
                       .Select(i => a[2*i])
                       .ToArray();
Run Code Online (Sandbox Code Playgroud)

或者使用按位来更有效地检查甚至:

var result = a.Where((i, index) => (index & 1) == 0)
              .ToArray();
Run Code Online (Sandbox Code Playgroud)

  • +1为逐位奇数/偶数测试,这比'%'运算符效率更高.如此优雅:-) (2认同)

Tim*_*ter 8

余数运算符是你的朋友.

int[] everySecond = a.Where((i, ind) => ind % 2 == 0).ToArray();
Run Code Online (Sandbox Code Playgroud)

%运算符(C#参考)

%运算符在将第一个操作数除以第二个操作数后计算余数.所有数字类型都有预定义的余数运算

E.Lippert:有什么区别?剩余与模数