退貨類型爲IGrouping<TKey, TElement>
或IDictionary<TKey, TValue>
時,我可以使用yield return
嗎?收益回報僅適用於IEnumerable <T>?
回答
yield return
作品正好是4的情況:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
這是因爲它在內部建立一個狀態機;字典(等)將不可能與此。你當然可以只用return
來代替。
如果您想自己實現IEnumerable,請點擊http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx。 – Rory 2012-09-16 23:01:44
@Rory是的,自己實現它是一個龐大的PITA,我現在無法想象任何「正常」的原因,現在迭代器塊存在。我有一些這樣的,但通常是爲了兼容需要在C#1.2編譯器上構建的項目;不完全是「正常」的情況。 – 2012-09-17 06:48:13
nope,只是ienumerable :-)
不正確;請參閱我的答案; -p – 2009-07-01 19:53:01
我不這麼認爲。雖然documentation沒有完全拼出來,但其措辭方式意味着只有在方法的返回類型爲IEnumerable
或IEnumerable<T>
時才能使用它。您可能可以編寫一個實現IGrouping
的類,並給出IEnumerable
(這將從您的方法使用yield return
返回),但這是真正唯一的選擇。
語言規範將其拼寫出來,請參閱ECMA 334中的8.18 – 2009-07-01 19:54:22
不,因爲迭代器塊只是一個由編譯器代表您構建的狀態機。該功能可讓您「屈服」並將項目作爲序列的一部分。
如果返回類型不是IEnumerable<T>
(例如IDictionary
),編譯器將不得不生成實現該接口的方法,在這一點上它沒有多大意義,因爲您將使用集合而不是一個序列。
然而,您可以返回IEnumerable<KeyValuePair<K,V>>
,這將類似於字典。然後你會返回KeyValuePairs。你甚至可以用另一種方法來包裝這個方法,從返回中創建一個字典。第一種方法唯一不能保證的是按鍵的唯一性。
然後,您將失去O(1)訪問時間,並且必須遍歷每個單個KVP才能找到正確的密鑰,最差的O(n)次。 – 2009-08-18 19:30:15
答:編號A yield return
語句可用於只有在返回類型爲IEnumerator
,IEnumerator<T>
,IEnumerable
,或IEnumerable<T>
。
從§8.14的C# 3.0 spec:
yield語句是在迭代器塊使用的(第8.2節),以產生一個值枚舉器對象(§10.14.4)或枚舉對象(§10.14.5 )的迭代器或者表示迭代的結束。
從§10.14.4:
枚舉器對象具有以下特點:
- 它實現
IEnumerator
和IEnumerator<T>
,其中T
是迭代器的產率類型。
[...]
從§10.14.5:
可枚舉對象具有以下特點:
- 它實現
IEnumerable
和IEnumerable<T>
,其中T
是迭代器的產率類型。
[...]
只需調用iterator方法和鏈ToDictionary
或GroupBy
後,和你有類似的事情。如果你需要從幾個地方調用它,請將它放在單行包裝器方法中。
由於yield return
可以使用類型爲IEnumerator<T>
爲什麼不做這樣的事情呢?
internal static IEnumerable<Dictionary<byte, string>> GetData()
{
Dictionary<byte, string> result = GetMyData(); //read from db
yield return result;
}
希望它有幫助。
- 1. IEnumerable的<T>和「收益率回報」的性能問題
- 2. 異步任務<IEnumerable>有收益率回報?
- 3. 收益回報BRAINFREEZE
- 4. IEnumerable的收益率與回報相結合.AsParallel()
- 5. 收益率回報長度
- 6. 爲什麼我的IEnumerable <String>使用收益率回報較慢來迭代然後列表<String>
- 7. 序列化的IEnumerator <T>使用收益回報
- 8. 重載使用收益回報
- 9. 方法採用收益率回報
- 10. 犀牛模擬執行收益回報
- 11. 計算回報率內部收益率
- 12. 數據層收益率回報
- 13. .NET 4.0的重構對收益回報
- 14. C#收益率回報預期
- 15. 收益回報完成後關閉IDataReader
- 16. 收益率回報怪異的行爲
- 17. 「收益回報」概念的名稱是什麼? IEnumerable,迭代器,發生器?
- 18. 如果有一個收益,如何返回IEnumerable <T>集合
- 19. 什麼具體類型'收益回報'回報?
- 20. 關於收益率的回報,並從一個foreach
- 21. 產量返回IEnumerable <IEnumerable <...>>
- 22. <noscript>僅適用於CSS?
- 23. IEnumerable的實現<T>適用於foreach,但不適用於LINQ
- 24. 收益不起作用,但回報確實
- 25. 收益率的回報不會被調用方法的工作
- 26. 在Ruby中使用收益率和回報率
- 27. 強類型方法接口使用收益回報
- 28. 在Windows Phone上調用帶有收益回報的Webservice
- 29. 收益率回報慢的數據庫調用
- 30. PropertyChanged事件不適用於通過收益創建的集合
可能的重複[一些幫助理解「yield」](http://stackoverflow.com/questions/317462/some-help-understanding-yield) – nawfal 2014-07-09 06:54:38