c#如何遍历数组_c#遍历数组完整教程与代码实例
C#数组遍历:选对工具,避开那些“看似简单”的坑 开门见山,先说结论:在C#里遍历数组,foreach通常是那个最顺手、最安全的选择,但它绝非一把万能钥匙。一旦你需要修改元素或者依赖索引位置,就必须请出for循环。至于while和Array.ForEach,它们更像是工具箱里的特种工具,只在特定场景
C#数组遍历:选对工具,避开那些“看似简单”的坑

开门见山,先说结论:在C#里遍历数组,foreach通常是那个最顺手、最安全的选择,但它绝非一把万能钥匙。一旦你需要修改元素或者依赖索引位置,就必须请出for循环。至于while和Array.ForEach,它们更像是工具箱里的特种工具,只在特定场景下闪光,生搬硬套反而会弄巧成拙。
什么时候必须用 for 循环
如果你需要在遍历时“动点手脚”——比如修改数组元素的值,或者你的逻辑严重依赖当前的下标位置(例如跳过偶数索引、进行两两交换、计算相邻元素的差值),那么foreach就无能为力了。原因很简单:foreach提供的是元素的只读副本,你改了它也影响不了原数组,而且它根本不暴露索引信息。
- 像
foreach (int x in arr) { x = 10; }这样的代码完全是徒劳,x只是个临时副本。 - 真正要干“实事”,比如反转数组、实现冒泡排序、或者把所有偶数下标的元素清零,都得靠
for (int i = 0; i < arr.Length; i++)这种经典结构。 - 这里有个关键细节:获取数组长度,
arr.Length是唯一可靠的来源。别误用了GetLength(0),那是为多维数组准备的。
foreach 的实际限制和坑点
foreach语法看似清爽,但一不小心就容易在类型转换和性能上栽跟头,特别是在处理int[]和object[]混用的场景时。
- 如果你对一个
int[]使用foreach (object o in arr),每次迭代都会触发一次“装箱”操作,性能就在不知不觉中流失了。正确的做法是明确类型:foreach (int x in arr)。 - 反过来,如果数组本身是
object[],里面可能装着各种类型,而你却写了foreach (string s in arr),那么运行时一旦遇到非字符串元素,就会毫不客气地抛出一个InvalidCastException。 - 另外,关于控制流,
break或continue在foreach循环体内当然可以使用,但如果你嵌套得太深,代码的可读性会急剧下降,这一点需要警惕。
别为了“函数式”硬用 Array.ForEach
Array.ForEach看起来挺有“函数式编程”的范儿,写起来也简洁。但实际上,它限制颇多、调试起来更费劲,而且无法提前退出循环,在90%的场景下,都不如老老实实写个for循环来得实在。
- 像
Array.ForEach(arr, x => Console.WriteLine(x));这样的简单输出没问题,但如果你想在遇到某个特定值(比如0)时就停止遍历?对不起,它做不到。 - 本质上,它只是封装了一个
for循环,并没有带来性能上的优势,反而额外增加了一层委托调用的开销。 - 它的泛型约束也比较死板,只适用于一维数组。对于更常用的
List,你得使用其自带的ForEach实例方法,千万别搞混了。 - 如果真想进行链式、声明式的数据处理,应该优先考虑LINQ中的
Select、Where等方法。不过切记:LINQ通常返回一个新的序列,而不会修改原始数组。
说到底,数组遍历的语法本身并不复杂。真正容易出问题的,往往是那种“你以为自己在遍历一个数组”的错觉。实际上,你操作的可能是一个IEnumerable包装器,它可能延迟执行,甚至可能被多次枚举。所以,比起死记硬背语法,时刻盯紧你的变量类型和数据源的本质,才是更重要的事。


































