(编辑:代码略显整洁。)
使用像这样的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; });
答案 0 :(得分:3)
我建议你只使用普通的foreach
循环来转换数据。您使用的方法仅存在于List<T>
实现中,但不存在于数组上。
使用foreach
的方法确实无法获得任何收益,除非出于某种原因您想要在方法链中进行数据突变。在这种情况下,您也可以为IEnumerable<T>
编写自己的扩展方法。不过,我建议不要这样做。
具有单独的foreach
循环使读者清楚地知道数据突变正在发生。它还消除了为循环的每次迭代调用委托的开销。它也可以在任何集合类型下工作,只要它是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
循环中尝试此操作,则会出现编译器错误。
答案 1 :(得分:2)
答案 2 :(得分:1)
您已为数组使用List.ForEach()
方法的语法,但Array.ForEach()
语法为:
public static void ForEach<T>(
T[] array,
Action<T> action
)
数组应该是 one-dimensional 以便在Array.ForEach()
中使用它的一个要点。考虑到这一点,我建议使用简单的for
循环
// first dimension
for (int index = 0; index < bytesArray.GetLength(0); index++)
// second dimension
for (int index = 0; index < bytesArray.GetLength(1); index++)
// third dimension
for (int index = 0; index < bytesArray.GetLength(2); index++)
答案 3 :(得分:1)
我不知道采用多维数组的ForEach方法。 如果你想要一个,我认为你必须自己创建它。
以下是如何操作:
private static void ForEach<T>(T[, ,] a, Action<T> action)
{
foreach (var item in a)
{
action(item);
}
}
示例程序,使用新的ForEach方法:
static class Program
{
static void Main()
{
byte[, ,] a = new byte[2, 10, 10];
ForEach(a, delegate(byte b)
{
Console.WriteLine(b);
});
}
private static void ForEach<T>(T[, ,] a, Action<T> action)
{
foreach (var item in a)
{
action(item);
}
}
}
此外,ForEach
版本中的Array
方法不是实例方法,而是statis方法。你这样称呼它:
Array.ForEach(array, delegate);
答案 4 :(得分:0)
List
具有第一个实例方法。数组没有。
答案 5 :(得分:0)
原始数组的实例方法比通用集合少得多,因为它们不是模板化的。这些方法(例如ForEach()
或Sort()
)通常以静态方法实现,这些方法本身就是模板化的。
在这种情况下,Array.Foreach(a, action)
将为数组提供技巧。
当然,经典foreach(var b in a)
适用于List和Array,因为它只需要一个枚举器。
然而:
(b=1)
无效。因为您收到的是值,而不是参考。