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

C#中的这个是怎么回事

我建议您只使用正常的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,因为它只需要一个枚举器。

然而:

  1. 我不确定您将如何遍历多维数组。
  2. 您的作业(b=1)不起作用。因为您收到的是值,而不是引用。

List具有第一个实例方法。 数组则不然。