c# - C#中foreach循环中的计数器

标签 c# foreach counter

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/

相关文章:

c# - Executenonquery InvalidOperationException

c# - Microsoft Visual C# 组合框/列表框

c# - 在组合框中,如何确定突出显示的项目(未选择的项目)?

php - 从包含数组的 foreach PHP 插入数据

c# - 简化 C# 中的多个(非嵌套)foreach 循环

java - 如何使用 Java 8 方法对 List<List<>> 结构中的每个元素应用一些更改

bash - 损坏 : Elif in For loop with increment counter

c# - 如何编写一个在 C# 中打开图像的方法,该方法将使用移动设备上的默认图像查看器...?

javascript - 使用 Javascript、HTML 和 CSS 的计数器不起作用

emacs - 定义 Emacs 宏计数器的步长