你如何获得foreach循环的当前迭代的索引?

是否有一些罕见的语言构造我没有遇到(像我最近学到的一些,在堆栈溢出一些)在C#中获得一个值代表当前迭代的foreach循环?

例如,我现在根据具体情况做这样的事情:

int i=0;
foreach (Object o in collection)
{
    // ...
    i++;
}

foreach用于迭代实现IEnumerable集合。 它通过调用集合上的GetEnumerator来完成此操作,该集合将返回一个Enumerator

这个枚举器有一个方法和一个属性:

  • 的MoveNext()
  • 当前
  • Current返回Enumerator Current的对象, MoveNext Current更新为下一个对象。

    显然,一个索引的概念对于枚举的概念来说是陌生的,不可能完成。

    因此,大多数集合都可以使用索引器和for循环结构来遍历。

    与使用局部变量跟踪索引相比,我更喜欢在这种情况下使用for循环。


    Ian Mercer在Phil Haack的博客上发布了类似的解决方案:

    foreach (var item in Model.Select((value, i) => new { i, value }))
    {
        var value = item.value;
        var index = item.i;
    }
    

    这通过使用Linq的Select重载获取item( item.value )及其索引( item.i ):

    函数[在Select中]的第二个参数表示源元素的索引。

    new { i, value }正在创建一个新的匿名对象。


    可以做这样的事情:

    public static class ForEachExtensions
    {
        public static void ForEachWithIndex<T>(this IEnumerable<T> enumerable, Action<T, int> handler)
        {
            int idx = 0;
            foreach (T item in enumerable)
                handler(item, idx++);
        }
    }
    
    public class Example
    {
        public static void Main()
        {
            string[] values = new[] { "foo", "bar", "baz" };
    
            values.ForEachWithIndex((item, idx) => Console.WriteLine("{0}: {1}", idx, item));
        }
    }
    
    链接地址: http://www.djcxy.com/p/1521.html

    上一篇: How do you get the index of the current iteration of a foreach loop?

    下一篇: Hidden Features of C#?