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>() 这种方式才可以用。具体我做了下测试:这种才可以用arr.IndexOf(item) 形式获取到索引。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);
输出值: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类型。方法三适用的类型是数组类型