作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
(编辑:稍微整理一下代码。)
像这样使用 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/
我是一名优秀的程序员,十分优秀!