我使用了yield return
关键字,但是当我想向IEnumerable
添加范围时,我发现它缺乏。这是我想做的一个简单示例:
IEnumerable<string> SomeRecursiveMethod()
{
// some code
// ...
yield return SomeRecursiveMethod();
}
当然这会导致错误,可以通过简单的循环来解决。有一个更好的方法吗?一个循环感觉有点笨拙。
答案 0 :(得分:45)
yield!
,但在C#中没有等价物 - 基本上你必须使用循环。对不起......我感觉到你的痛苦。我在one of my Edulinq blog posts中提到过,它会让事情变得更简单。
请注意,递归使用收益率回报可能会很昂贵 - 请参阅Wes Dyer's post on iterators以获取更多信息(并提及四年前正在考虑的“收益率预期”......)
答案 1 :(得分:5)
如果您已经有IEnumerable
进行循环,并且返回类型为IEnumerable
(就像可以使用yield return
的函数的情况一样),您只需返回该枚举即可
如果您需要合并多个IEnumerable
的结果,则可以使用IEnumerable<T>.Concat
扩展方法。
但是,在递归示例中,您需要根据枚举的内容终止枚举/连接。我不认为我的方法会支持这个。
答案 2 :(得分:0)
yield关键字确实非常好。但是将它嵌套在for循环中会导致生成和执行更多的胶水代码。
如果您可以使用功能较少的编程风格,可以将附加的List传递给您:
void GenerateList(List<string> result)
{
result.Add("something")
// more code.
GenerateList(result);
}