【问题标题】:What is the proper pattern for handling Enumerable objects with a yield return?处理具有收益返回的可枚举对象的正确模式是什么?
【发布时间】:2012-11-04 09:21:31
【问题描述】:

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

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

    public IEnumerable<object> YieldReturningFunction()
    {

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

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

    }

明确使用 foreach 循环只是为了向我返回可枚举的代码气味的结果。

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

【问题讨论】:

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


【解决方案1】:

不,没有办法。

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

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

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

【讨论】:

  • 我将其标记为已接受的答案不是因为它给了我正在寻找的答案,而是因为它很好地解释了为什么我正在寻找的答案没有(还)存在。
【解决方案2】:

做不到。不过还不错。您可以将其缩短为一行:

foreach (var o in otherEnumerator) yield return o;

不相关的注意事项:您应该注意您的生成器中包含的逻辑;所有执行都推迟到在返回的IEnumerable 上调用GetEnumerator()。我发现自己经常以这种方式错误地抛出NullArgumentExceptions,以至于我认为值得一提。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2018-11-25
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多