Parallel iteration in C#?

前端 未结 6 1545
耶瑟儿~
耶瑟儿~ 2021-02-06 08:05

Is there a way to do foreach style iteration over parallel enumerables in C#? For subscriptable lists, I know one could use a regular for loop iterati

6条回答
  •  不知归路
    2021-02-06 08:45

    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 Combine(params object[] sources)
    {
        foreach(var o in sources)
        {
            // Choose your own exception
            if(!(o is IEnumerable)) throw new Exception();
        }
    
        var enums =
            sources.Select(s => ((IEnumerable)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.
    }
    

提交回复
热议问题