带索引的foreach

这个问题在这里已经有了答案:

  • 你如何获得foreach循环的当前迭代的索引? 31个答案

  • 我为此保留了这个扩展方法:

    public static void Each<T>( this IEnumerable<T> ie, Action<T, int> action )
    {
        var i = 0;
        foreach ( var e in ie ) action( e, i++ );
    }
    

    像这样使用它:

    var strings = new List<string>();
    strings.Each( ( str, n ) =>
    {
        // hooray
    } );
    

    或者考虑到类似break的行为:

    public static bool Each<T>( this IEnumerable<T> ie, Func<T, int, bool> action )
    {
        int i = 0;
        foreach ( T e in ie ) if( !action( e, i++ ) ) return false;
        return true;
    }
    
    var strings = new List<string>() { "a", "b", "c" };
    bool iteratedAll = strings.Each( (str, n) ) =>
    {
        if( str == "b" ) return false;
        return true;
    } );
    

    您可以执行以下操作

    foreach ( var it in someCollection.Select((x,i) => new { Value = x, Index=i }) )
    {
       if ( it.Index > SomeNumber) //      
    }
    

    这将为收集中的每个条目创建一个匿名类型值。 它将有两个属性

  • 价值:与集合中的原始价值
  • 索引:与索引内的集合

  • C#foreach没有内置索引。 您需要在foreach循环外部添加一个整数并每次增加一个整数。

    int i = -1;
    foreach (Widget w in widgets)
    {
       i++;
       // do something
    }
    

    或者,您可以使用标准for循环,如下所示:

    for (int i = 0; i < widgets.Length; i++)
    {
       w = widgets[i];
       // do something
    }
    
    链接地址: http://www.djcxy.com/p/52963.html

    上一篇: foreach with index

    下一篇: Existing LINQ extension method similar to Parallel.For?