首先我知道我不能在C#中使用foreach循环来添加值,比如说一个数组......但为什么呢?为什么例如我不能这样做
int[] numbers = { 1, 4, 3, 5, 7, 9 };
foreach (int item in numbers)
{
numbers[item] = 2;
}
它是否与后端的foreach循环的实际实现有关? foreach循环如何正常工作?我知道它贯穿整个集合(数组)但究竟是怎么回事?
答案 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
变量,如索引,就像它具有值1
,2
,{{1 }},3
等等这不是foreach迭代变量如何适用于C#。我知道这种方式的唯一语言是Javascript。
请记住,4
和foreach
不是一回事。几乎所有其他语言(包括C#)都会在for
循环的item
变量中为您提供实际的数组值:foreach
,1
,4
, 3
等等。现在,这些是整数,因此可以尝试将它们用作索引。您可以像这样运行循环...直到达到值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);
}