c#Array.ForEach替换元素的替代方法

use*_*679 3 c# arrays foreach transform

是否有一个我可以使用的标准函数,它类似于ForEach迭代一个数组,将一个函数应用于每个元素并用结果替换它在数组中?

类似下面的内容,但后面的维度包含每个元素的IntPow(2,i)的结果.

dimensionPowers = Enumerable.Range(0, dimensions + 1).ToArray();
Array.ForEach(dimensionPowers,
    (i) => IntPow(2, i));
Run Code Online (Sandbox Code Playgroud)

(我知道我可以使用for循环迭代数组 - 我只是想知道是否有更简洁的替代方案).

Ste*_*ung 9

MSDN文档说,由于以下事实,设计人员故意没有放入带有阵列的"ForEach":1)写入是完全无关紧要的,2)确切地说你的问题 - 人们会对原始数组是否被修改感到困惑或不.

大多数ForEach类型的数组迭代器实现(实际上你需要一个"map"函数)返回一个新的数组实例.例如,您可以使用LINQ:

newArray = dimensionPowers.Select(i => IntPow(2,i)).ToArray();
Run Code Online (Sandbox Code Playgroud)

或更好:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2,i)).ToArray();
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要就地修改原始数组,那么有一个很好的旧的for循环:

for (int i=0; i < dimensionPowers.Length; i++) { dimensionPowers[i] = IntPow(2,i); }
Run Code Online (Sandbox Code Playgroud)

.NET的设计者强迫您使用这些不同的方法,以便您知道何时修改数组.

如果要实施就地修改,可以创建扩展方法:

static void ForEachModifyInPlace<T> (this Array<T> array, Func<T,T> map_action) {
    for (int i=0; i < array.Length; i++) { array[i] = map_action(array[i]); }
}
Run Code Online (Sandbox Code Playgroud)