在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代替foreachforeach不公开它的内部工作,它枚举任何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