我已经读过迭代HashSet是不好的做法。我应该首先调用.ToList()吗?

时间:2011-11-02 16:48:43

标签: c# list enumeration hashset

我有一个名为RegisteredItems的项目集合。我不关心RegisteredItems中项目的顺序,只关注它们是否存在。

我在RegisteredItems上执行两种类型的操作:

  • 按物业查找并退回物品。
  • 迭代收集并有副作用。

根据:When should I use the HashSet<T> type? Robert 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的上述引语让我对迭代它感到不安。

在这种情况下,正确的呼叫是什么?感谢

3 个答案:

答案 0 :(得分:10)

如果您不关心订单,请使用HashSet&lt;&gt;。引用是关于使用HashSet&lt;&gt;当你担心订单时会很危险。如果您多次运行此代码,并且项目按不同顺序操作,您会关心吗?如果没有,那你就没事了。如果是,则不要使用HashSet&lt;&gt;。任意转换为List并不能真正解决问题。

我不确定,但我怀疑.ToList()将迭代HashSet&lt;&gt;要做到这一点,那么,现在你要走两次了。

不要过早优化。如果您只有100个项目,只需使用HashSet&lt;&gt;然后继续前进。如果您开始关注订单,请将其更改为List&lt;&gt;然后将其用作任何地方的列表。

答案 1 :(得分:2)

如果你真的不关心订单而且你知道你的hashset中没有重复(这就是你想要的),那就继续使用hashset。

答案 2 :(得分:2)

在引用的问题中,我认为他说如果你遍历一个Set,你可以轻易地欺骗自己认为这些项目是按照一定的顺序。例如,以不同方式处理第一个迭代项很容易,但不保证您将保留第一个迭代项。

只要你牢记这一点,并考虑Set无序,迭代就可以了。