C# foreach 中获取索引index方法的补充

本文探讨了在C#中使用foreach循环遍历数组和列表时获取元素索引的不同方法,包括直接计数、使用IndexOf方法及Array.IndexOf方法,并讨论了这些方法的有效性和适用场景。

foreach循环获取索引方法有时是需要的。在网上找到的无一例外是这个:

方法一:

int i = 0;
foreach (var item in arr)
{
       i++;
}


方法二:

foreach (var item in arr)
{
      int index = arr.indexOf(item); //index 为索引值
}

来源:http://www.cnblogs.com/zhyue93/p/foreach.html

第一个没有异议,但是第二个方法,这个对于我遇到的实际是没有作用的。我的是数组

int[] arr = new int[]{ 1, 2, 3, 4, 5, 6,3 };

这种你用arr.看智能提示中有没有indexof方法。最后我真的烦了,打算找出可行的方法。经过详细的测试,方法二是有条件的。它的条件就是变量是
new List<int>() 这种方式才可以用。具体我做了下测试:
string str1 = "";
var list = new List<int>() { 1, 2, 3, 4, 5, 6 ,2};
foreach(var item in list)
{
var index = list.IndexOf(item);
str1 += "index:" + index + ",value:" + item + " | ";
}
EventLog.WriteLog(str1);

这种才可以用arr.IndexOf(item) 形式获取到索引。
输出值:index:0,value:1 | index:1,value:2 | index:2,value:3 | index:3,value:4 | index:4,value:5 | index:5,value:6 | index:1,value:2 | 
可看到第二个输出索引是1,而第七个值,由于也是2,与第二个重复,索引输出也是1.
这意味着只有在值不重复的情况下获取的索引才是正确的。
而数组的情况下索引获取不能按第二种方法写。
方法三:
int[] arr = new int[]{ 1, 2, 3, 4, 5, 6,3 };
string str = "";
foreach(var item in arr)
{
var index = Array.IndexOf(arr, item);
str += "index:" + index + ",value:" + item + " | ";

}
EventLog.WriteLog(str);

这是数组情况下索引获取的写法:var index=Array.IndexOf(arr,item);
输出值:index:0,value:1 | index:1,value:2 | index:2,value:3 | index:3,value:4 | index:4,value:5 | index:5,value:6 | index:2,value:3 | 
看下输出值,第三个值和第七个值都是3,因此获取到的索引都是2.
这说明这种方法获取的索引也需要在不重复的情况下才能与方法一的相同。
获取索引若在值没有重复的情况下,方法一,方法二,方法三都能正确获取。若有重复,还是需要用方法一才能正确获取。
方法二适用的情况是List类型。方法三适用的类型是数组类型


### C# 中使用 `foreach` 访问索引号的方法C# 编程中,虽然 `foreach` 循环提供了遍历集合的简便方式,但它本身并不直接支持访问当前项的索引。然而,可以通过多种方法实现这一目标。 #### 方法一:外部定义索引变量 一种常见的做法是在 `foreach` 外部定义一个索引变量,并在每次迭代时对其进行递增操作。这种方式简单直观,适用于大多数场景: ```csharp int index = 0; foreach (var item in array) { Console.WriteLine($"Index: {index}, Value: {item}"); index++; } ``` 此方法通过手动维护索引来跟踪当前位置[^1]。 #### 方法二:使用 `IndexOf` 函数 另一种方法是利用集合的 `IndexOf` 方法来查找当前项的位置。不过需要注意的是,这种方法仅适用于能够调用 `IndexOf` 的集合类型(如列表或数组)。以下是示例代码: ```csharp List<string> list = new List<string> { "A", "B", "C" }; foreach (var item in list) { int index = list.IndexOf(item); Console.WriteLine($"Index: {index}, Value: {item}"); } ``` 尽管该方法有效,但如果集合较大或者包含重复元素,则性能可能会受到影响[^1]。 #### 方法三:结合 LINQ 和匿名类型 借助于 .NET Framework 提供的语言集成查询(LINQ),可以将集合与其对应的索引组合成新的结构体来进行处理。下面展示了一个例子: ```csharp string[] fruits = { "Apple", "Banana", "Cherry" }; var indexedFruits = fruits.Select((fruit, index) => new { Index = index, FruitName = fruit }); foreach (var fruitInfo in indexedFruits) { Console.WriteLine($"Index: {fruitInfo.Index}, Name: {fruitInfo.FruitName}"); } ``` 这里我们使用了 `Select` 方法生成一个新的序列,其中每个元素都是由原集合中的值及其对应索引构成的一个匿名对象[^3]。 --- ### 总结 以上介绍了三种不同的技术手段以实现在 `foreach` 遍历时获取索引的目的。每种都有各自的优缺点以及适用范围,请根据实际情况选择最适合的方式应用到自己的项目当中去。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值