LINQ可以被要求跳过/离开特定索引吗?

Nik*_*wal 4 .net c# linq loops

我自己是LINQ的忠实粉丝.LINQ反映了简洁的艺术.同样在.Net中我们说LINQ比循环领先一步,或者我们可以说LINQ是循环++.

但这真的是这样吗?

为什么我的判断是因为我试图将这个转换为循环代码转换为LINQ但是混淆了LINQ跳过/离开索引?

double[] NMD = {3.0, 5.0, 6.0, 65.0, 34.0, 3.0, 5.0, 6.0, 65.0, 34.0, 3.0, 5.0, 6.0, 65.0, 34.0 };

for(int i=1; i<NMD.Length-1; i+=2)
   NMD[i] = NMD[i]/10;
Run Code Online (Sandbox Code Playgroud)

在这里我要求循环从索引1开始并停在倒数第二个值并且也跳过2的值.所以我们可以在LINQ中这样做.IMO我不这么认为但我会很高兴被证明是错的.

Nik*_* B. 5

您可以在里面测试索引Select并相应地选择您的操作:

NMD = NMD.Select((x, i) => i % 2 == 1 && i < NMD.Length - 1 ? x / 10 : x).ToArray();
// => { 3, 0.5, 6, 6.5, 34, 0.3, 5, 0.6, 65, 3.4, 3, 0.5, 6, 6.5, 34 }
Run Code Online (Sandbox Code Playgroud)

但是,正如您可能已经通过查看此语句的大小已经弄清楚的那样,LINQ 在这里不是概念上的改进,因为您只能使用它创建新序列而不是改变现有序列.

也就是说for,在我看来,循环很好,实际上更具可读性.你应该将它改进为"LINQ is sequence generation ++"或"read-only iteration ++",而不是说"LINQ is loops ++".

如果你想有效地使用LINQ,你必须以更实用的方式重新思考和重新设计你的代码(例如,使用不可变的数据结构),而不是for用LINQ表达式替换每个循环.如果您这样做并且理智,那么您可以提高代码质量,并使交换机并行执行在未来更少问题.