C#:yield return range/collection

And*_*sch 43 .net c# yield

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

IEnumerable<string> SomeRecursiveMethod()
{
    // some code 
    // ...
    yield return SomeRecursiveMethod();
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 48

不,我不害怕.F#确实支持这个yield!,但在C#中没有相应的东西 - 基本上你必须使用循环.对不起......我感觉到你的痛苦.我在我的一篇Edulinq博客文章中提到,它会让事情更简单.

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

  • @Lasse:我也希望它神奇地出现!Cme的COmega研究版具有此功能.但是我听到一个传闻,作者后来发现,在某些涉及抛出异常的嵌套迭代器的情况下,用该语言提出的堆栈效率代码转换是不正确的.可能没有一种简单的方法来执行仍然有效的此功能.它在列表中,但我们有很多更高的优先级. (8认同)

Mer*_*ham 5

如果你已经有一个IEnumerable循环,并且返回类型是IEnumerable(对于可以使用的函数的情况yield return),你可以简单地返回该枚举.

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

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

  • 但这会显着改变行为 - 迭代器块延迟执行;如果你没有任何“yield return”语句,它都会急切地执行。 (3认同)