2

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

4

2 回答 2

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;
    }
}
于 2013-08-28T04:34:32.160 回答
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 签名,则代码甚至可以在进行少量更改的情况下运行。

于 2013-08-28T07:33:41.217 回答