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

时间:2011-03-27 12:56:50

标签: c# arrays foreach transform

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

如下所示,但之后的维度包含每个元素的IntPow(2,i)的结果。

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

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

2 个答案:

答案 0 :(得分:9)

MSDN文档说,由于以下事实,设计师故意没有放入带有阵列的“ForEach”:1)写入是微不足道的,2)确切地说你的问题 - 人们会对原来是否感到困惑数组是否被修改。

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

newArray = dimensionPowers.Select(i => IntPow(2,i)).ToArray();

或更好:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2,i)).ToArray();

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

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

.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]); }
}

答案 1 :(得分:0)

我认为你不能更简洁(使用现有的方法)。

您可以将这两个步骤合并为一个:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2, i)).ToArray();