收益率和并行ForEach

时间:2015-09-16 20:15:14

标签: c#

以下是代码的测试样本 [...]

    public IEnumerable<B> GetList(A obj)
    {
        Parallel.ForEach(obj.yTest.Keys, key =>
        {
            switch (key)
            {
                case "1":
                    yield return new B() {Name = obj.yTest[key]};
                    break;
                case "2":
                    yield return new B() {Name = obj.yTest[key]};
                    break;
                case "3":
                    yield return new B() {Name = obj.yTest[key]};
                    break;
                case "4":
                    yield return new B() {Name = obj.yTest[key]};
                    break;
            }
        });
    }
}

class B
{
    public string Name { get; set; }
}

错误: &#34;只有方法,运营商和访问者才能包含“产量”和“产出”。语句&#34;

1 个答案:

答案 0 :(得分:3)

你不能在这样的lambda中使用yield。不过,您可以使用PLINQ选择语句替换Parallel.ForEach

public IEnumerable<B> GetList(A obj)
{
    return obj.yTest.Keys.AsParallel().Select(key =>
    {
        switch (key)
        {
            case "1":
                return new B() {Name = obj.yTest[key]};
                break;
            case "2":
                return new B() {Name = obj.yTest[key]};
                break;
            case "3":
                return new B() {Name = obj.yTest[key]};
                break;
            case "4":
                return new B() {Name = obj.yTest[key]};
                break;
            default:
                return new B() {Name = obj.yTest[key]};
                break;
        }
    });
}

这将为您提供IEnumerable的并行选择以及您从yield return获得的延迟执行。