C#:收益率范围/收集

我使用yield return关键字相当多,但是当我想向IEnumerable添加一个范围时,我发现它缺乏。 下面是我想要做的一个快速示例:

IEnumerable<string> SomeRecursiveMethod()
{
    // some code 
    // ...
    yield return SomeRecursiveMethod();
}

当然这会导致错误,可以通过简单的循环来解决。 有一个更好的方法吗? 一个循环感觉有点笨拙。


不,我不害怕。 F#支持这个yield! ,但在C#中没有等价物 - 基本上,您必须使用循环。 对不起......我感到你的痛苦。 我在我的一篇Edulinq博客文章中提到过,它会让事情变得更简单。

请注意,递归使用yield return会很昂贵 - 请参阅Wes Dyer在迭代器上的帖子以获取更多信息(并提及四年前正在考虑的“yield foreach”)...)


如果您已经有一个IEnumerable循环,并且返回类型是IEnumerable (就像可以使用yield return函数一样),那么您可以简单地返回该枚举。

如果您遇到需要合并多个IEnumerable结果的情况,可以使用IEnumerable<T>.Concat扩展方法。

但是,在递归示例中,您需要根据枚举的内容来终止枚举/连接。 我不认为我的方法会支持这一点。


yield关键字确实非常好。 但是将它嵌套在for循环中会导致生成和执行更多的胶水代码。

如果您可以使用不太实用的编程风格,则可以传递一个List,并将其添加到其中:

 void GenerateList(List<string> result)
 {

      result.Add("something")

      // more code.

      GenerateList(result);

 }
链接地址: http://www.djcxy.com/p/53007.html

上一篇: C#: yield return range/collection

下一篇: Is the List<T>.ForEach() method gone?