繁体   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