"yield return" 更紧凑的方式?

More compact way for "yield return"?

我有这个方法可以产生 2 种方法产生的值:

private IEnumerable<Node> ParseEmptyElement()
{
    foreach (var node in ParseMembersOfObject()) 
    {
        yield return node;
    }

    foreach (var node in ParseNestedProperty()) 
    {
        yield return node;
    }
}

对我来说非常冗长

有没有更好的表达方式 "yield all values from MethodX" 然后,对 MethodY 做同样的事情?

示例:

private IEnumerable<Node> ParseEmptyElement()
{
    #yield all# items from ParseMembersOfObject();    
    #yield all# items from ParseNestedProperty();
}

我不想被迫将 foreach 循环 写成一行!但我也不想编写带有花括号和所有东西的完整 foreach 循环 :)

正如 Marc 所说,这等同于:

private IEnumerable<Node> ParseEmptyElement()
{
    return ParseMembersOfObject().Concat(ParseNestedProperty());
}

Concat 是使用延迟执行实现的,因此这不会提前评估您的枚举。

顺便说一句,Concatimplementedforeach 循环在一行上:

static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, 
                                                    IEnumerable<TSource> second) {
    foreach (TSource element in first) yield return element;
    foreach (TSource element in second) yield return element;
}

如果你不喜欢 Concat,但你仍然想要大括号,你仍然可以保留它们并更简洁地格式化你的代码:

private IEnumerable<Node> ParseEmptyElement()
{
    foreach (var node in ParseMembersOfObject()) { yield return node; }
    foreach (var node in ParseNestedProperty())  { yield return node; }
}