嵌套的IEnumerable<>;在C#中
本文关键字:lt IEnumerable 嵌套 gt | 更新日期: 2023-09-27 18:29:12
我其实并不需要这个功能,但如果我能让编译器允许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
。
是的,这是它的唯一工作方式。每个值都应该使用"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;
}
}
作为一个相当简单的替代方案,您可以使用普通的静态方法来实现代码。
只需定义这些:
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签名,代码甚至可能在运行时几乎没有更改。