Yield return and Parallel ForEach

本文关键字:ForEach Parallel and return Yield | 更新日期: 2023-09-27 18:13:00

下面是代码的测试样例[…]

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

错误:"只有方法、操作符和访问器可以包含'yield'语句"

Yield return and Parallel ForEach

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

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获得的延迟执行。