c# - c# 中的这个 foreach 是怎么回事?

标签 c# loops foreach compiler-errors

(编辑:稍微整理一下代码。)

像这样使用 foreach 效果很好。

var a = new List<Vector2>();

a.ForEach(delegate(Vector2 b) {
    b.Normalize(); });

然而,以下会导致“方法‘ForEach’没有重载需要 1 个参数”。

byte[,,] a = new byte[2, 10, 10];

a.ForEach(delegate(byte b) {
    b = 1; });

最佳答案

我建议您只使用普通的 foreach循环来转换数据。您使用的方法仅存在于 List<T> 上实现,但不在数组上。

使用 foreach 的方法真的没有任何好处,除非出于某种原因你想在方法链中进行数据突变。在那种情况下,您不妨为 IEnumerable<T> 编写自己的扩展方法。 .不过,我不建议这样做。

有一个单独的foreach循环让读者清楚地知道数据突变正在发生。它还消除了为循环的每次迭代调用委托(delegate)的开销。只要它是 IEnumerable,无论集合类型如何,它都可以工作。 (不完全正确,您可以编写自己的枚举数和可枚举数,但这是另一个问题)。

如果您只想进行数据转换(即投影等),请使用 LINQ。

另请记住,使用数组,您将获得 byte 的副本不是引用。您将只修改 byte不是原来的。这是一个输出示例:

int[] numbers = new int[] { 1, 2, 3, 4, 5 };

Array.ForEach(numbers, number => number += 1);

foreach(int number in numbers)
{
    Console.WriteLine(number);
}

产生输出:

1 2 3 4 5

如您所见,lambda 中的数字 += 1 没有任何效果。事实上,如果你在一个正常的 foreach 中试过这个循环,你会得到一个编译器错误。

关于c# - c# 中的这个 foreach 是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931319/

相关文章:

php - Joomla 中的简单 "loop"

c# - 使用 MEF 从 shell 加载 Prism 模块 View

c# - 如何编写一个接受数据行并填充对象属性的通用函数?

c# - 将 XUnit 与 Service Fabric 结合使用

perl - 如何在 Perl 中通过 SIGHUP 在 while(1) 之后跳转?

c - 遍历 C 中的多个数组

C# DataGridView 的图像不显示

php - Laravel 5 如何在循环中循环

r - R中的doRedis/foreach GBM并行处理错误

javascript - 在 forEach 循环中创建 promise 并在不嵌套的情况下使用它们