一、手动维护索引变量
实现方式:
在循环外部声明索引变量,每次迭代手动递增:
int index = 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index++; }
特点:
- 简单直接,无需引入额外依赖12。
- 需注意线程安全及变量作用域问题。
二、LINQ Select
+ 元组解构
实现方式:
利用 LINQ 的 Select
方法将元素与索引绑定为元组(C# 7.0+ 支持元组解构语法):
foreach (var (item, index) in collection.Select((value, i) => (value, i))) { Console.WriteLine($"{index}: {item}"); }
特点:
- 代码简洁,避免手动维护索引13。
- 需引入
System.Linq
命名空间。
三、扩展方法封装索引
实现方式:
自定义扩展方法 WithIndex
,将集合元素与索引打包返回:
public static class EnumerableExtensions { public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> source) { return source.Select((item, index) => (item, index)); } } // 调用 foreach (var (item, index) in collection.WithIndex()) { Console.WriteLine($"{index}: {item}"); }
特点:
- 增强代码复用性,适用于频繁获取索引的场景3。
四、使用 for
循环替代
实现方式:
若需直接操作索引,可改用 for
循环:
for (int i = 0; i < collection.Count; i++) { var item = collection[i]; Console.WriteLine($"{i}: {item}"); }
特点:
- 直接访问索引,适用于支持索引器的集合(如数组、
List<T>
)57。 - 无法用于不支持索引器的集合(如
IEnumerable<T>
)。
方法对比与适用场景
方法 | 适用场景 | 优点 | 限制 |
---|---|---|---|
手动维护索引变量 | 简单场景,无需复杂依赖 | 无额外依赖,灵活 | 需手动管理,易出错 |
LINQ + 元组解构 | 需要简洁语法且支持 C# 7.0+ 的项目 | 代码紧凑 | 依赖 LINQ,性能略低 |
扩展方法 | 高复用性需求 | 可复用,代码结构清晰 | 需预先定义扩展类 |
for 循环替代 | 支持索引器的集合(数组、List<T> 等) | 直接高效 | 不适用于 IEnumerable<T> |
操作建议:
- 优先选择 LINQ + 元组解构 或 扩展方法,以保持代码简洁性和可维护性13。
- 对性能敏感的场景,改用
for
循环或手动维护索引57。