.net-C#:收益率返回范围/集合

我使用了yield return关键字很多,但是当我想将范围添加到IEnumerable时发现它缺少关键字。这是我想做的一个简单示例:

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

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

André Hauptfleisch asked 2020-08-11T18:00:51Z
3个解决方案
47 votes

不,我没有担心。 F#确实支持3006999750546818018048,但C#中没有等效功能-基本上,您必须使用循环。 对不起...我感到你很痛苦。 我在我的Edulinq博客文章之一中提到了它,它会使事情变得更简单。

请注意,递归使用收益回报可能会很昂贵-有关更多信息,请参阅Wes Dyer在迭代器上的帖子(并提及四年前正在考虑的“收益foreach” ...)

Jon Skeet answered 2020-08-11T18:01:01Z
5 votes

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

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

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

Merlyn Morgan-Graham answered 2020-08-11T18:01:31Z
0 votes

yield关键字确实非常不错。 但是将其嵌套在for循环中将导致生成和执行更多的粘合代码。

如果您可以使用功能较少的编程风格,则可以传递一个列表,并在其后附加:

 void GenerateList(List<string> result)
 {

      result.Add("something")

      // more code.

      GenerateList(result);

 }
answered 2020-08-11T18:02:06Z
translate from https://stackoverflow.com:/questions/5415902/c-yield-return-range-collection