c#foreach循环无法在数组中添加文字

时间:2017-02-05 20:14:25

标签: c#

首先我知道我不能在C#中使用foreach循环来添加值,比如说一个数组......但为什么呢?为什么例如我不能这样做

int[] numbers = { 1, 4, 3, 5, 7, 9 };
foreach (int item in numbers)
{
    numbers[item] = 2;
}

它是否与后端的foreach循环的实际实现有关? foreach循环如何正常工作?我知道它贯穿整个集合(数组)但究竟是怎么回事?

4 个答案:

答案 0 :(得分:4)

您传入的是项目的值(您的变量item,将是数组中每个位置的数组值,而不是数组中的索引)指数。在那里使用的索引意味着您尝试访问的项目的位置,而不是值。所以你调用的循环的每次迭代都是:

  • numbers[1]
  • numbers[4]
  • numbers[3]
  • numbers[5]
  • numbers[7]
  • numbers[9]

数组有6个数字,所以当你到达numbers[7]时,你要求的值不存在,因此是例外。

更好的方法是做你想做的事情:

for(int i = 0; i < numbers.Length; i++)
{
    numbers[i] = 2;
}

在此循环的每次迭代中,您将访问:

  • numbers[0]
  • numbers[1]
  • numbers[2]
  • numbers[3]
  • numbers[4]
  • numbers[5]

答案 1 :(得分:3)

您需要step through your code in a debugger

r语句更像是for语句,而不是while

foreach行创建了这个:

int[] numbers = { 1, 4, 3, 5, 7, 9 };

您的numbers[0] = 1; numbers[1] = 4; numbers[2] = 3; numbers[3] = 5; numbers[4] = 7; numbers[5] = 9; 声明执行此操作:

foreach

您必须了解数组索引和数组值之间的区别。

答案 2 :(得分:3)

我在看这个:

numbers[item] = 2;

在此表达式中,您使用item变量,如索引,就像它具有值12,{{1 }},3等等这不是foreach迭代变量如何适用于C#。我知道这种方式的唯一语言是Javascript。

请记住,4foreach不是一回事。几乎所有其他语言(包括C#)都会在for循环的item变量中为您提供实际的数组值:foreach143等等。现在,这些是整数,因此可以尝试将它们用作索引。您可以像这样运行循环...直到达到值5。此时,您的数组只有六个值。你正试图这样做:

7

对于可以使用的最大有效索引为numbers[7] = 2; 的数组。

即使考虑到对阵列的修改也是如此。让我们看看每次迭代循环后的数组:

5

对于为什么 ...这听起来像是习惯了一种更动态的语言。一些其他语言,如php或Javascript,在纯粹的计算机科学意义上根本没有真正的数组。相反,他们有集合类型,他们将调用一个数组,但是当你开始使用它时,实际上是不同的。

C#具有真正的数组,而实数数组具有固定大小。如果您真正想要的是集合,那么C#也有集合。例如,您可以使用{ 1, 4, 3, 5, 7, 9 } //initial state { 1, 2, 3, 5, 7, 9 } // after 1st iteration (index 0). Value at index 0 is 1, so item as index 1 is set to 2 { 1, 2, 2, 5, 7, 9 } // after 2nd iteration (index 1). Value at index 1 is now 2, so item at index 2 is set to 2 { 1, 2, 2, 5, 7, 9 } // after 3rd iteration (index 2). Value at index 2 is now 2, so item at index 2 is set to 2 { 1, 2, 2, 5, 7, 2 } // after 4th iteration (index 3). Value at index 3 is 5, so item at index 5 is set to 2 // The 5th iteration (index 4). Value at index 4 is 7, which is beyond the end of the array 个对象来获取可以轻松追加的类似数组的集合。

对于其他语言,结果取决于您所说的内容,但是对于最宽松的第5次迭代的结果是这样的:

List<T>

请注意索引6处的缺失值。这种情况会导致错误,这些错误会在测试中出现并且在运行时才会显示。您还需要开始想知道阵列将被填充的密集程度或稀疏程度,因为处理这些阵列的最佳策略可能会根据您的答案而有很大差异......所有这些都只是程序员必须使用的具有空节点的大型后备阵列了解Hashtables和Dictionaries的所有方法。顺便说一下,C#再次为您提供了这些选项。

答案 3 :(得分:-1)

您需要创建计数器,在其他情况下,您尝试访问数组

之外的项目
int[] numbers = new int[]{ 1, 4, 3, 5, 7, 9 };
int i = 0;
foreach (int item in numbers)
{
    numbers[i] = 2;
    i++;
}

// Print the items of the array
foreach (int item in numbers)
{
    Console.WriteLine(item);
}