嵌套的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

嵌套的IEnumerable<>;在C#中

是的,这是它的唯一工作方式。每个值都应该使用"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签名,代码甚至可能在运行时几乎没有更改。