【问题标题】:Why does this foreach loop throw an error but the for loop does not? [duplicate]为什么这个 foreach 循环会抛出错误,而 for 循环不会? [复制]
【发布时间】:2017-09-08 12:22:12
【问题描述】:

所以我尝试使用谷歌搜索,但找不到任何可以回答我问题的信息。

基本上我有一个包含 {1,2,3,4,5,6,7,8,9,10} 的数组。我有一个 for 循环和一个 foreach 循环,据我所知,它们做同样的事情(只打印可被 2 整除的数字)。 for 循环工作正常 - 它打印 2、4、6、8 和 10。foreach 循环似乎也打印了正确的整数,但由于某种原因它抛出了 IndexOutOfRangeExeption。为什么 for 循环工作完全没有错误,但 foreach 循环打印正确的整数,但仍然抛出错误?

代码如下:

int[] tenNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Console.WriteLine(tenNums.Length);

for (int i = 0; i < tenNums.Length; i++)
{
    if (tenNums[i] % 2 == 0)
    {
        Console.WriteLine(tenNums[i]);
    }
}

foreach (int i in tenNums)
{
    if (tenNums[i] % 2 == 0) // <== Error happens on this line
    {
        Console.WriteLine(tenNums[i]);
    }
}
Console.ReadKey();

【问题讨论】:

  • @BalagurunathanMarimuthu 当我这样做时,for 循环不会打印数字 10?
  • @BalagurunathanMarimuthu:OP 为什么要忽略最后一个值?

标签: c# foreach


【解决方案1】:
foreach (int i in tenNums)
{
    if (tenNums[i] % 2 == 0) // <== Error happens on this line
    {
        Console.WriteLine(i);
    }
}

在这个foreach中,i会依次取tenNums内每个值的值。所以i 不再是你要增加的索引。当使用数字 10 作为索引时,您正在尝试访问未分配给数组的内存。更改它以便您检查i

foreach (int i in tenNums)
{
    if (i % 2 == 0)
    {
        Console.WriteLine(i);
    }
}

【讨论】:

  • 谢谢,您的解决方案有效。据我了解,我的代码基本上是说 tenNums[tenNums[9]] 等于不存在的 tenNums[10]。
  • @P.Protas 没错!导致 IndexOutOfRangeException。
【解决方案2】:

for 循环从 0 开始,一直到 9。foreach 从第一个值 1 开始,一直到最后一个值 10。当您使用索引器访问数组时,它的索引为 0 ,所以你有一个错误。

你真正想要的是这个:

foreach (int i in tenNums)
{
    if (i % 2 == 0) // <= No need to use the indexer since we already have the value
    {
        Console.WriteLine(i);
    }
}

【讨论】:

    【解决方案3】:

    当使用foreach 循环时,您应该使用i 而不是tenNums[i]

    所以:

    foreach (int i in tenNums)
    {
        if (i % 2 == 0)
        {
            Console.WriteLine(i);
        }
    }
    

    这基本上是foreach 在这种情况下的意义——避免使用tenNums[i]

    即使您遇到的错误也显示了foreach 的好处。使用tenNums[something] 时,您始终需要关注something 是否实际有效(例如,您可能有一个错误的错误)。使用foreach 则无需担心 - i 工作。

    【讨论】:

      【解决方案4】:

      您的第一个 for 循环将使用 0、1、2、3、4、5、6、7、8 和 9。

      您的第二个 foreach 循环将使用 1、2、3、4、5、6、7、8、9 和 10,因为这些是数组中的值。

      tenNums[10] 上会发生什么?一个错误!

      【讨论】:

        【解决方案5】:

        很简单。
        而不是这个:

        if (tenNums[i] % 2 == 0)
        {
            Console.WriteLine(tenNums[i]);
        }
        

        使用这个:

        if (i % 2 == 0)
        {
            Console.WriteLine(i);
        }
        

        【讨论】:

          【解决方案6】:

          因为您试图在 foreach 循环中访问 tenNums[10](tenNums 的第 10 项)。

          【讨论】:

            猜你喜欢
            • 2015-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多