当前位置: 首页 > article >正文

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:元素唯一且需动态查找索引,性能差,重复元素不可靠‌。

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


http://www.kler.cn/a/574561.html

相关文章:

  • 【机械视觉】C#+visionPro联合编程———【一、C# + VisionPro 联合编程详解以及如何将visionPro工具加载到winform】
  • unity调用本地部署deepseek全流程
  • 函数扩展【ES6】
  • Manus AI 全球首款通用型 Agent,中国制造
  • 极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【一】
  • MATLAB中startsWith函数用法
  • 面试基础---Redis 延迟队列深度解析
  • ssm_mysql_暖心家装平台
  • 华为OD机试-Excel单元格数值统计(Java 2024 E卷 200分)
  • Mybatis中的分页操作,如何使用PageHelper进行分页,以及Spring Boot整合Mybatis Plus分页
  • SpringBoot读取类路径下文件
  • 【DeepSeek】5分钟快速实现本地化部署教程
  • 【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)
  • Java TCP 通信:实现简单的 Echo 服务器与客户端
  • 单片机最小系统原理图设计
  • 【芯片设计】AI偏车载芯片前端设计工程师面试记录·20250304
  • Linux网络编程——TCP并行服务器
  • Swagger UI界面的使用
  • Ae 效果详解:VR 球面到平面
  • 【解决问题】conda 虚拟环境内,`pip list` 展示全局的包