使用yield return处理Enumerable对象的正确模式是什么?

时间:2012-11-15 17:47:19

标签: c# ienumerable design-patterns yield-return

是否存在返回Enumerable中所有项目的yield的标准模式?

我经常发现我的一些代码反映了以下模式:

    public IEnumerable<object> YieldReturningFunction()
    {

        ...
        [logic and various standard yield return]
        ...

        foreach(object obj in methodReturningEnumerable(x,y,z))
        {
            yield return obj;
        }

    }

显式使用foreach循环只是为了向我返回可枚举的代码味​​道的结果。

显然,我可以放弃使用yield return来增加代码的复杂性,方法是显式构建一个Enumerable并将每个标准yield返回的结果添加到它中,并添加 methodReturningEnumerable的结果范围。这是不幸的,因此我希望有更好的方法来管理收益率回报模式。

2 个答案:

答案 0 :(得分:5)

不,没有办法解决这个问题。

这是一个被请求的功能,这不是一个坏主意(其他语言中存在yield foreach或同等的功能)。

此时,微软根本没有分配时间和金钱来实施它。他们将来可能会也可能不会实施它;我猜(没有任何事实依据)它是在待办事项清单上的某个地方;这只是一个问题,即它是否/何时在该列表上足够高以实际实现。

我能看到的唯一可能的变化是将方法顶部的所有单个yield returns重构为它们自己的可枚举返回方法,然后添加一个返回该方法的串联的新方法方法和methodReturningEnumerable(x,y,z)。会更好吗?不,可能不是。 Concat会尽可能多地添加回来,如果不是更多的话。

答案 1 :(得分:2)

无法完成。但这并不是那么糟糕。您可以将其缩短为一行:

foreach (var o in otherEnumerator) yield return o;

无关注意:您应该注意发电机中包含的逻辑;延迟所有执行,直到在返回的GetEnumerator()上调用IEnumerable为止。我经常以这种方式错误地抛出NullArgumentException,我觉得值得一提。 :)