C#中的这个是怎么回事
本文关键字:怎么回事 | 更新日期: 2023-09-27 18:12:53
(编辑:代码略微整洁。
像这样使用 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
循环可以让读者清楚地知道正在发生数据突变。 它还消除了为循环的每次迭代调用委托的开销。 无论集合类型如何,只要它是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
循环中尝试这样做,你会得到一个编译器错误。
您正在使用两种不同的ForEach
'es。
byte[,,]
示例中的 Array.ForEach(尽管您用错了它(和 List<...>
示例中的 List.ForEach。
你已经对数组使用了List.ForEach()
方法的语法,但Array.ForEach()
语法是:
public static void ForEach<T>(
T[] array,
Action<T> action
)
一个重要的一点是,数组应该是一维的,以便在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++)
哪个 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);
}
}
}
此外,Array
版本中的ForEach
方法不是实例方法,而是statis方法。你这样称呼它:
Array.ForEach(array, delegate);
原始数组的实例方法比泛型集合少得多,因为它们不是模板化的。这些方法(如ForEach()
或Sort()
(通常作为静态方法实现,这些方法本身是模板化的。
在这种情况下,Array.Foreach(a, action)
将为数组解决问题。
当然,经典foreach(var b in a)
适用于 List 和 Array,因为它只需要一个枚举器。
然而:
- 我不确定您将如何遍历多维数组。
- 您的作业
(b=1)
不起作用。因为您收到的是值,而不是引用。
List
具有第一个实例方法。 数组则不然。