Search code examples
c#loopsforeachiterationenumerable

Combined iteration over lined up enumerables in C#?


Is there a way to do foreach style iteration over lined up enumerables in C#? For subscriptable lists, I know one could use a regular for loop iterating an int over the index range, but I really prefer foreach to for for a number of reasons.

Bonus points if it works in C# 2.0.

Clarification: I am talking about multiple lined up enumerables. Like arrays of pencils and papers. I want each pencil to write on the corresponding paper.

Note: Originally this question used the term parallel instead of lined up.


Solution

  • Short answer, no. foreach works on only one enumerable at a time.

    However, if you combine your parallel enumerables into a single one, you can foreach over the combined. I am not aware of any easy, built in method of doing this, but the following should work (though I have not tested it):

    public IEnumerable<TSource[]> Combine<TSource>(params object[] sources)
    {
        foreach(var o in sources)
        {
            // Choose your own exception
            if(!(o is IEnumerable<TSource>)) throw new Exception();
        }
    
        var enums =
            sources.Select(s => ((IEnumerable<TSource>)s).GetEnumerator())
            .ToArray();
    
        while(enums.All(e => e.MoveNext()))
        {
            yield return enums.Select(e => e.Current).ToArray();
        }
    }
    

    Then you can foreach over the returned enumerable:

    foreach(var v in Combine(en1, en2, en3))
    {
        // Remembering that v is an array of the type contained in en1,
        // en2 and en3.
    }