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

发布于 2024-10-27 04:38:46 字数 317 浏览 7 评论 0原文

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

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

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

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

Is there a standard function I can use that iterates over an array similarly to ForEach, applying a function to each element and replacing it in the array with the result?

Something like the following, but where dimension powers afterwards contains the results of IntPow(2, i) on each element.

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

(I know I can iterate over the array with a for loop - I'm just wondering if there's a more concise alternative).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遮云壑 2024-11-03 04:38:46

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

The MSDN docs says that the designers deliberately did not put in a "ForEach" with an Array due to the fact that: 1) it is trivial to write, 2) exactly your problem -- people will get confused whether the original array is modified or not.

Most of the ForEach types of array iterator implementation (you actually need a "map" function) returns a new instance of an array. For example, you can use LINQ:

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

or better:

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

However, if you want to modify the original array in-place, there is the good old for-loop:

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

The designers for .NET forces you to use these different methods just so that you'll know when an array is modified.

If you want to implement your in-place modification, you can create an extension method:

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]); }
}
不喜欢何必死缠烂打 2024-11-03 04:38:46

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

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

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

I don't think you can do it much more concisely (using existing methods).

You could collapse the two steps in one:

dimensionPowers = Enumerable.Range(0, dimensions + 1).Select(i => IntPow(2, i)).ToArray();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文