foreach 的工作: 据我所知,
foreach is a loop which iterates through a collection or array one by one, starting from 0 index till the last item of the collection.
所以,如果我在一个数组中有 n 个项目。
foreach (var item in arr)
{
}
然后,
在第 1 次迭代中,item=arr[0];
然后,在第二个中,item=arr[1];
.
.
.
在最后(第 n 个)中,item=arr[n-1];
结论:从工作来看,它似乎在每次迭代中都知道要从数组中获取哪个值,或者它知道要从数组中获取的项目的索引。
现在我的问题是:如何在不使用新变量的情况下获取项目的索引?
foreach (string item in mylist)
{
if (item == "myitem")
{
// get index of item
break;
}
}
最佳答案
这取决于你所说的“它”是什么意思。迭代器知道它达到了什么索引,是的 - 在 List<T>
的情况下或数组。但是IEnumerator<T>
里面没有总索引.是否迭代索引集合取决于实现。许多集合不支持直接索引。
(事实上,foreach
并不总是使用迭代器。如果集合的编译时类型是数组,编译器将使用 array[0]
、array[1]
等对其进行迭代。同样该集合可以有一个名为 GetEnumerator()
的方法,它返回一个具有适当成员的类型,但看不到 IEnumerable
/IEnumerator
的任何实现。)
维护索引的选项:
- 使用
for
循环 - 使用单独的变量
使用投影将每个项目投影到索引/值对,例如
foreach (var x in list.Select((value, index) => new { value, index })) { // Use x.value and x.index in here }
使用我的
SmartEnumerable
有点像前面选项的类
无论集合是否自然编入索引,除第一个选项外,所有这些选项都有效。
关于c# - C#中foreach循环中的计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337660/