在C#中的并行迭代? [英] Parallel iteration in C#?

查看:157
本文介绍了在C#中的并行迭代?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法做到在C#中的并行可枚举的foreach 风格迭代?对于标化的名单,我知道人们可以使用普通的循环遍历索引范围int,但我真的喜欢的foreach 的多种原因。

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 iterating an int over the index range, but I really prefer foreach to for for a number of reasons.

奖励积分,如果它工作在C#2.0

Bonus points if it works in C# 2.0

推荐答案

简短的回答,没有。 的foreach 同时适用于只有一个枚举。

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

不过,如果你把你的并行可枚举成一个单一,可以的foreach 过合并。我不知道有任何容易的,建在这样的方法,但下面应该工作(虽然我没有测试过):

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();
    }
}



然后你可以的foreach 在返回枚举:

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

这篇关于在C#中的并行迭代?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆