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

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

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

public IEnumerable YieldReturningFunction() { ... [logic and various standard yield return] ... foreach(object obj in methodReturningEnumerable(x,y,z)) { yield return obj; } } 

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

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

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

这是一个被要求的function,这不是一个坏主意(其他语言中存在一个yield foreach或同等产品)。

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

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

无法做到。 虽然这并不是那么糟糕。 您可以将其缩短为一行:

 foreach (var o in otherEnumerator) yield return o; 

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