2015-04-22 74 views
2

我有这样的方法产生的2种方法得到的值:更加紧凑的“收益回报”方式?

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

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

看来非常详细我。

是否有更好的方式表达“从MethodX中产生所有值”,然后对MethodY执行相同的操作?

例子:

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

我不想被强制写foreach循环成一条线!但我也不想写不折不扣foreach循环用花括号和所有的东西:)

+7

'返回ParseMembersOfObject().Concat(ParseNestedProperty())'? –

+1

[C#:return yield range/collection]可能的重复(http://stackoverflow.com/questions/5415902/c-return-yield-range-collection) –

+0

也相关:http://stackoverflow.com/questions/ 1270024/nested-yield-return-with-ienumerable –

回答

2

正如马克评论说,这是等价的:

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

Concat实现使用延迟执行,所以这不会提前评估你的枚举数。

顺便说一句,Concatimplemented与单行foreach循环:

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

如果你不喜欢的毗连,你还是要大括号,你仍然可以让他们,只是格式化你的代码更简洁:

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

不幸的是,当你有代码时,Concat并没有那么多帮助。请看看这个方法:https://github.com/SuperJMN/OmniXAML/blob/master/Source/OmniXaml/Parsers/ProtoParser/XamlProtoInstructionParser.cs#L47 – SuperJMN