C# foreach中获取循环索引的4种方式
在C#中使用foreach循环的时候我们有时会碰到需要索引的情况,在for循环中我们可以得到循环索引 , foreach并不直接提供 , 下面介绍4种foreach获取索引的方法,希望对大家有用处:
一、手动维护索引变量
实现方式:
在循环外部声明 index 变量,每次循环时手动递增:
int index = 0;
foreach (var item in collection)
{
Console.WriteLine($"{index}: {item}");
index++;
}
特点:
简单直接,无需引入额外依赖。
需注意线程安全及变量作用域问题。
二、LINQ Select + 元组解构
实现方式:
通过 Select 方法将元素与索引绑定为元组,结合 C# 7.0+ 的元组解构语法:
foreach (var (item, index) in collection.Select((value, i) => (value, i)))
{
Console.WriteLine($"{index}: {item}");
}
特点:
代码简洁,无需外部变量。
需注意 System.Linq 命名空间和 System.ValueTuple 包(旧版本需手动安装)。
三、扩展方法封装
实现方式:
自定义扩展方法 WithIndex,增强代码复用性:
public static IEnumerable<(T item, int index)> WithIndex(this IEnumerable source)
{
return source.Select((item, index) => (item, index));
}
// 调用
foreach (var (item, index) in collection.WithIndex())
{
Console.WriteLine($"{index}: {item}");
}
特点:
提高代码可读性和复用性。
需在静态类中定义扩展方法。
四、IndexOf 方法(需谨慎)
实现方式:
调用集合的 IndexOf 方法直接获取元素索引(适用于 List 等支持索引查找的集合):
foreach (var item in collection)
{
int index = collection.IndexOf(item);
Console.WriteLine($"{index}: {item}");
}
特点:
依赖集合的 IndexOf 实现,仅适用于元素唯一且支持索引查找的集合。
性能较差:每次循环均遍历集合查找索引,时间复杂度为 O(n^2)。
局限性:集合中存在重复元素时可能返回错误索引。
性能与适用性
手动维护索引:适用于简单场景,性能最优。
LINQ 方法:引入轻微性能开销(如迭代器生成),但对大多数场景影响可忽略。
扩展方法:适合高频使用场景,平衡性能与代码整洁度。
IndexOf:元素唯一且需动态查找索引,性能差,重复元素不可靠。
选择时需根据具体需求(如代码简洁性、性能要求、框架版本兼容性)综合考量。