2012-11-15 52 views
5

是否存在返回Enumerable中所有項目的yield的標準模式?使用yield return來處理Enumerable對象的正確模式是什麼?

更多的時候,比我想我找到了一些我的代碼反映了以下模式:

public IEnumerable<object> YieldReturningFunction() 
    { 

     ... 
     [logic and various standard yield return] 
     ... 

     foreach(object obj in methodReturningEnumerable(x,y,z)) 
     { 
      yield return obj; 
     } 

    } 

foreach循環的明確的使用只是爲了代碼味道的可枚舉惡臭的結果返回給我。

很顯然,我可以放棄使用的收益率回報被明確地建立一個可枚舉並添加每個標準收益率迴歸到它的結果,以及添加的methodReturningEnumerable的結果的範圍增加了我的代碼的複雜性。這將是不幸的,因爲我希望有更好的方法來管理收益率回報模式。

+1

你問'產量foreach',它不存在。的[與IEnumerable的嵌套收率返回] – SLaks

+3

可能重複(http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable)的 – Euphoric

+0

可能重複的[產率返回許多?](HTTP://計算器.com/questions/3851997/yield-return-many) – nawfal

回答

5

沒有,周圍沒有辦法。

它一直要求一個功能,它不是一個壞主意(一yield foreach或等值的其他語言的存在)。

此時微軟根本沒有分配來實現它的時間和金錢。他們未來可能會或可能不會實施;我猜(沒有事實依據),它在待辦事項清單上的某處;這只是一個問題,它是否/何時在列表上達到足夠高的水平才能真正實施。

唯一可能的變化,我可以看到是從方法的頂部到自己的枚舉返回方法重構了所有的個人yield returns,然後添加返回方法和methodReturningEnumerable(x,y,z)的級聯的新方法。它會更好嗎?不,可能不是。如果不是更多,Concat會重新添加,就像您保存的一樣。

+1

我將此標記爲已接受的答案,不是因爲它給了我所尋找的答案,而是因爲它解釋了爲什麼我要找的答案不(存在)。 – rheone

2

不能完成。雖然沒有那麼糟糕。您可以將它縮短爲一行:

foreach (var o in otherEnumerator) yield return o; 

無關的注意事項:您應該小心發電機中包含的邏輯;所有執行都被推遲到返回IEnumerable上調用GetEnumerator()。我常常以這種方式錯誤地拋出NullArgumentException s,所以我認爲這值得一提。 :)

相關問題