更紧凑的方式来回报"?

时间:2015-04-22 22:23:55

标签: c# .net coding-style ienumerable yield-return

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

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

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

对我来说,似乎非常详细

是否有更好的方式来表达&#34;从MethodX&#34中获得所有价值;之后,对MethodY做同样的事情吗?

示例:

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

我不想强迫将 foreach循环写入一行!但是我也不想用大括号和所有东西写完全成熟的 foreach循环:)

1 个答案:

答案 0 :(得分:2)

正如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; }
}