2015-04-22 44 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