C# 数组(foreach语句)
foreach语句
foreach语句允许我们连续访问数组中的每一个元素。其实它是一个比较通用的结构,可以
和其他集合类型一起使用——但是本节只会讨论它和数组的使用。
有关foreach语句的重点如下所示。
- 迭代变量是临时的,并且和数组中元素的类型相同。foreach语句使用迭代变量来相继表
示数组中的每一个元素。 - foreach语句的语法如下,其中
- Type是数组中元素的类型。我们可以显式提供它的类型,也可以使用va让其成为隐
式类型并通过编译器来推断,因为编译器知道数组的类型。 - ldentifier是迭代变量的名字。
- ArrayName是要处理的数组的名字。
- Satement是要为数组中的每一个元素执行一次的单条语句或语句块。
- Type是数组中元素的类型。我们可以显式提供它的类型,也可以使用va让其成为隐
在之后的内容中,有时会使用隐式类型,而有时又会使用显式类型,这样我们就可以看到使
用的确切类型,但是两种形式的语法是等价的。
foreach语句以如下方式工作。
- 从数组的第一个元素开始并把它赋值给迭代变量。
- 然后执行语句主体。在主体中,我们可以把迭代变量作为数组元素的只读别名。
- 在主体执行之后,foreach语句选择数组中的下一个元素并重复处理。
这样,它就循环遍历了数组,允许我们逐个访问每一个元素。例如,如下代码演示了foreach
语句和一个具有4个整数的一维数组的使用。 - foreach语句的主体WriteLine语句为数组的每一个元素执行一次。
- 第一次遍历时,迭代变量item就有了数组中第一个元素的值。相继执行后,它就有了数
组中下一个元素的值。
迭代变量是只读的
由于迭代变量的值是只读的,所以它不能改变。但是,这对于值类型数组和引用类型数组而
言效果不一样。
对于值类型数组,这意味着在用迭代变量表示数组元素的时候,我们不能改变它们。例如,
在如下的代码中,尝试改变迭代变量中的数据产生了编译时错误消息:
对于引用类型数组,我们仍然不能改变迭代变量,但是迭代变量只是保存了数据的引用,而
不是数据本身。因此,虽不能改变引用,但我们可以通过迭代变量改变数据。
如下代码创建了一个有4个MyClass对象的数组并将其初始化。在第一个foreach语句中,
改变了每一个对象中的数据。在第二个foreach语句中,从对象读取改变后的值。
class MyClass{public int MyField=0;
}class Program{static void Main(){MyClass[] mcArray=new MyClass[4]; //创建数组for(int i=0;i<4;i++){mcArray[i]=new MyClass(); //创建类对象mcArray[i].MyField=i; //设置字段}foreach(MyClass item in mcArray)item.MyField+=10; //改变数据foreach(MyClass item in mcArray)Console.WriteLine($"{item.MyField}");//读取改变的数据}
}
foreach语句和多维数组
在多维数组中,元素的处理次序是最右边的索引号最先递增。当索引从0到长度减1时,开
始递增它左边的索引,右边的索引被重置成0。
矩形数组的示例
如下代码演示了将foreach语句用于矩形数组:
class Program
{static void Main(){int total=0;int[,] arr1={{10,11},{12,13}}foreach(var element in arr1){total+=element;Console.WriteLine($"Element:{element},Current Total:{total}");}}
}
交错数组的示例
交错数组是数组的数组,所以我们必须为交错数组中的每一个维度使用独立的foreach语句。
foreach语句必须嵌套以确保每一个嵌套数组都被正确处理。
例如,在如下代码中,第一个foreach语句遍历了顶层数组(arr1),选择了下一个要处理
的子数组。内部的foreach语句处理了子数组的每一个元素。