我是否可以使用一个标准函数,它类似于ForEach迭代一个数组,将一个函数应用于每个元素并用结果替换它在数组中?
如下所示,但之后的维度包含每个元素的IntPow(2,i)的结果。
dimensionPowers = Enumerable.Range(0, dimensions + 1).ToArray();
Array.ForEach(dimensionPowers,
(i) => IntPow(2, i));
(我知道我可以使用for循环迭代数组 - 我只是想知道是否有更简洁的替代方案。)
答案 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();