【问题标题】:c# Array.ForEach alternative that replaces elementsc# Array.ForEach 替换元素的替代方案
【发布时间】:2011-07-23 21:21:18
【问题描述】:

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

类似于以下内容,但维度幂之后包含 IntPow(2, i) 对每个元素的结果。

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

(我知道我可以使用 for 循环遍历数组 - 我只是想知道是否有更简洁的选择)。

【问题讨论】:

  • 你能覆盖dimensionPowers吗? dimensionPowers 是否有来自不同地方的多个指针?
  • 你的意思是像ConvertAll 这样基于某些转换器函数返回新数组的东西吗?
  • dimensionPowers 只是一个 int[]

标签: c# arrays foreach transform


【解决方案1】:

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

【讨论】:

  • 感谢您的深入回答。
【解决方案2】:

我认为你不能更简洁地做到这一点(使用现有方法)。

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

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

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多