这个foreach在c#中有什么用?

时间:2011-10-28 15:23:09

标签: 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; });

6 个答案:

答案 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)

您正在使用两个不同的ForEach'es。

byte[,,]示例中的

Array.ForEach(虽然您使用不当)和List<...>示例中的List.ForEach

答案 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,因为它只需要一个枚举器。

然而:

  1. 我不确定你是如何遍历多维数组的。
  2. 您的作业(b=1)无效。因为您收到的是值,而不是参考。