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循环迭代数组 - 我只是想知道是否有更简洁的替代方案).
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)