C#:yield return range / collection

时间:2011-03-24 07:15:53

标签: c# .net yield

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

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

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

3 个答案:

答案 0 :(得分:45)

不,我不害怕。 F#确实支持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);

 }