C#遍历数组最常用最安全的是foreach,但修改元素或依赖索引时必须用for;while和Array.ForEach仅适用于特定场景。

直接说结论:C# 遍历数组最常用、最安全的方式是 foreach,但不是万能的;需要修改元素或依赖索引时,必须用 for;while 和 Array.ForEach 属于特定场景补充,别硬套。
什么时候必须用 for 循环
当你需要在遍历过程中修改数组元素值,或者逻辑强依赖当前下标(比如跳过偶数位、两两交换、查找相邻差值),foreach 就不行——它只提供副本,改了也不影响原数组,且没有索引变量。
-
foreach (int x in arr) { x = 10; }—— 这完全没用,x是只读副本 - 要反转数组、实现冒泡排序、把偶数下标元素置零,都得靠
for (int i = 0; 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控制外层逻辑?可以,但别嵌太深,可读性会崩
别为了“函数式”硬用 Array.ForEach
Array.ForEach 表面简洁,实则限制多、调试难、无法提前退出,90% 场景不如手写 for。
-
Array.ForEach(arr, x => Console.WriteLine(x));可以,但你想在遇到0时停止?做不到 - 它本质是封装了
for,没省性能,还多一层委托调用开销 - 泛型约束死:只能用于一维数组,
List得用ForEach实例方法,别混 - 真想链式处理,优先考虑 LINQ 的
Select/Where,但注意:它们返回新集合,不修改原数组
数组遍历本身不复杂,真正容易出问题的是“以为自己在遍历数组”,结果操作的是 IEnumerable 包装、延迟执行、甚至被多次枚举——盯住你的变量类型和数据源,比记住语法重要得多。











