我真的不需要这个功能,但是如果我能让编译器允许yield return
与另一个IEnumerable<>
一起使用,那么就有机会简化一些代码。示例如下所示:
static void Main(string[] args){
foreach (string str in EnumerateA())
Console.WriteLine(str);
}
static IEnumerable<string> EnumerateA(){
yield return "1";
yield return EnumerateB("2");
yield return EnumerateB("3");
}
static IEnumerable<string> EnumerateB(string num){
yield return num + "+";
yield return num + "-";
}
我知道我可以替换
yield return EnumerateB("2")
带
foreach(string str in EnumerateB("2")) yield return str;
并且有这项工作,但这是唯一的方法吗?我的目标是.NET 2.0
。
答案 0 :(得分:3)
是的,这是唯一有效的方法。应使用'yield return'返回每个值,不能将值作为集合返回。
这是错误的
static IEnumerable<string> EnumerateA()
{
yield return "1";
yield return EnumerateB("2");
yield return EnumerateB("3");
}
正确的方法是
static IEnumerable<string> EnumerateA()
{
yield return "1";
foreach (var str in EnumerateB("2"))
{
yield return str;
}
foreach (var str in EnumerateB("3"))
{
yield return str;
}
}
答案 1 :(得分:1)
作为一个相当简单的替代方法,您可以使用常规静态方法实现代码。
只需定义:
public static class Enumerable
{
public static IEnumerable<T> Return<T>(T value)
{
yield return value;
}
public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] lists)
{
foreach (var values in lists)
foreach (var value in values)
yield return value;
}
}
然后像这样实现你的方法:
static IEnumerable<string> EnumerateA()
{
return
Enumerable.Concat(
Enumerable.Return("1"),
EnumerateB("2"),
EnumerateB("3"));
}
我知道它不如使用静态方法那么好,给出了良好的流畅架构,但我认为这并不算太糟糕。如果您将来升级代码,它也会有所帮助。如果你遵循linq签名,代码甚至可能仍然只运行很少的变化。