嵌套的IEnumerable<>在C#中

时间:2013-08-28 04:26:02

标签: c#

我真的不需要这个功能,但是如果我能让编译器允许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

2 个答案:

答案 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签名,代码甚至可能仍然只运行很少的变化。