我有一个名为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的上述引语让我对迭代它感到不安。
在这种情况下,正确的呼叫是什么?感谢
答案 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无序,迭代就可以了。