C# foreach获取循环索引的四种方法

 更新时间:2025年03月07日 10:44:18   作者:NotOnlyCoding  
在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:元素唯一且需动态查找索引,性能差,重复元素不可靠‌。

选择时需根据具体需求(如代码简洁性、性能要求、框架版本兼容性)综合考量。

到此这篇关于C# foreach获取循环索引的四种方法的文章就介绍到这了,更多相关C# foreach获取索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unity3D实现控制摄像机移动

    Unity3D实现控制摄像机移动

    这篇文章主要为大家详细介绍了Unity3D实现控制摄像机移动 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C# 获取汉字的拼音首字母

    C# 获取汉字的拼音首字母

    一种是把所有中文字符集合起来组成一个对照表;另一种是依照汉字在Unicode编码表中的排序来确定拼音的首字母。碰到多音字时就以常用的为准(第一种方法中可以自行更改,方法为手动把该汉字移动到对应的拼音首字母队列,我们这里介绍第二种
    2015-06-06
  • WPF实现类似360安全卫士界面的程序源码分享

    WPF实现类似360安全卫士界面的程序源码分享

    最近在网上看到了新版的360安全卫士,感觉界面还不错,于是用WPF制作了一个,时间有限,一些具体的控件没有制作,用图片代替了。感兴趣的朋友一起跟着小编学习WPF实现类似360安全卫士界面的程序源码分享
    2015-09-09
  • C# 设计模式系列教程-状态模式

    C# 设计模式系列教程-状态模式

    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
    2016-06-06
  • C#中查找Dictionary中的重复值的方法

    C#中查找Dictionary中的重复值的方法

    这篇文章主要介绍了C#中查找Dictionary中的重复值的方法,需要的朋友可以参考下
    2015-09-09
  • Unity实现桌面反弹的示例代码

    Unity实现桌面反弹的示例代码

    反弹球是小时候都玩过的网页小游戏,但是很多人都不知道怎样实现,本文就来介绍一下Unity实现桌面反弹的示例代码,感兴趣的可以了解一下
    2021-05-05
  • 新手必看Unity2019 2020保姆级安装教程

    新手必看Unity2019 2020保姆级安装教程

    这篇文章主要介绍了Unity2019 2020安装教程,本文分步骤通过图文并茂的形式给大家介绍Unity2019 2020安装方法,需要的朋友可以参考下
    2021-05-05
  • c#打印预览控件中实现用鼠标移动页面功能代码分享

    c#打印预览控件中实现用鼠标移动页面功能代码分享

    项目中需要实现以下功能:打印预览控件中,可以用鼠标拖动页面,以查看超出显示范围之外的部分内容,下面就是实现代码
    2013-12-12
  • C#代码实现隐藏或显示Excel中的批注

    C#代码实现隐藏或显示Excel中的批注

    Excel 中的批注是一种附加在单元格上的文本说明,本文将为大家详细介绍如何通过 C# 在 Excel 中隐藏或显示批注,有需要的小伙伴可以了解下
    2026-06-06
  • C# 可空类型的具体使用

    C# 可空类型的具体使用

    这篇文章主要介绍了C# 可空类型的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论