簡體   English   中英

我已經讀過迭代HashSet是不好的做法。 我應該首先調用.ToList()嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM