[英]I have read that it is bad practice to iterate over a HashSet. Should I be calling .ToList() on it first?
我有一個名為RegisteredItems的項目集合。 我不關心RegisteredItems中項目的順序,只關注它們是否存在。
我在RegisteredItems上執行兩種類型的操作:
根據: 我什么時候應該使用HashSet <T>類型? 羅伯特R.說,
“迭代HashSet有點危險,因為這樣做會對集合中的項目施加一個順序。該順序實際上不是集合的屬性。你不應該依賴它。如果集合中的項目的排序很重要對你來說,那個系列不是一套。“
在某些情況下,我的收藏將包含50-100個項目。 我意識到這不是大量的項目,但我仍然希望獲得使用HashSet而不是List的回報。
我發現自己正在查看以下代碼並想知道該怎么做:
LayoutManager.Instance.RegisteredItems.ToList().ForEach( item => item.DoStuff() );
vs
foreach( var item in LayoutManager.Instance.RegisteredItems)
{
item.DoStuff();
}
RegisteredItems用於返回IList<T>
,但現在它返回一個HashSet。 我覺得,如果我使用HashSet提高效率,將它作為List進行轉換是不合適的。 然而,Robert的上述引言讓我對迭代它感到不安。
在這種情況下,正確的呼叫是什么? 謝謝
如果您不關心訂單,請使用HashSet <>。 引用是關於在擔心訂單時使用HashSet <>是危險的。 如果您多次運行此代碼,並且項目按不同順序操作,您會關心嗎? 如果沒有,那你就沒事了。 如果是,則不要使用HashSet <>。 任意轉換為List首先並沒有真正解決問題。
而且我不確定,但是我懷疑.ToList()會迭代HashSet <>來做到這一點,所以,現在你走了兩次集合。
不要過早優化。 如果您只有100個項目,只需使用HashSet <>然后繼續。 如果您開始關注訂單,請將其更改為List <>然后將其用作任何列表。
如果你真的不關心訂單而且你知道你的hashset中沒有重復(這就是你想要的),那就繼續使用hashset。
在引用的問題中,我認為他說如果你迭代一個Set,你可以輕易地欺騙自己認為這些項目是按照一定的順序。 例如,以不同方式處理第一個迭代項很容易,但不保證您將保留第一個迭代項。
只要你牢記這一點,並考慮Set無序,迭代就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.