在C#中的foreach循环中计数器
foreach的工作:据我所知,
foreach是一个循环,它从0索引开始一直到集合的最后一个项目,逐个遍历集合或数组。
所以,如果我有一个数组中的n个项目。
foreach (var item in arr)
{
}
然后,在第一次迭代中, item = arr [0];
那么,在第二项中, item = arr [1];
。
。
。
在last(nth)中, 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
类,这有点像上一个选项
除了第一个选项之外的所有选项都可以工作,无论该集合是否是自然索引的。
for
代替foreach
。 foreach
不公开它的内部工作,它枚举任何IEnumerable
(它根本不需要索引)。
for (int i=0; i<arr.Length; i++)
{
...
}
另外,如果你想要做的是找到列表中某个特定项目的索引,那么你就不必自己迭代它。 改用Array.IndexOf(item)
。
你对foreach
理解是不完整的。
它适用于公开IEnumerable
(或实现GetEnumerable
方法)的任何类型,并使用返回的IEnumerator
迭代集合中的项目。
Enumerator
器如何执行此操作(使用索引, yield
语句或魔术)是实现细节。
为了实现你想要的,你应该使用for
循环:
for (int i = 0; i < mylist.Count; i++)
{
}
注意:
根据列表的类型,获取列表中项目的数量略有不同
For Collections: Use Count [property]
For Arrays: Use Length [property]
For IEnumerable: Use Count() [Linq method]
链接地址: http://www.djcxy.com/p/52973.html
上一篇: Counter in foreach loop in C#
下一篇: Java, How do I get current index/key in "for each" loop