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

Sea*_*son 6 c# enumeration list hashset

我有一个名为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();
}
Run Code Online (Sandbox Code Playgroud)

RegisteredItems用于返回一个IList<T>,但现在它返回一个HashSet.我觉得,如果我使用HashSet提高效率,将它作为List进行转换是不合适的.然而,Robert的上述引言让我对迭代它感到不安.

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

i_a*_*orf 10

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

而且我不确定,但我怀疑.ToList()会迭代HashSet <>来做到这一点,所以,现在你走了两次集合.

不要过早优化.如果您只有100个项目,只需使用HashSet <>然后继续.如果您开始关注订单,请将其更改为List <>然后将其用作任何列表.

  • 好吧,在迭代它时,你无法修改任何类型的集合.那很糟.目前尚不清楚您对原始问题的担忧.在提出建议之前,你必须详细解释副作用.我建议开始一个新问题,措辞为"我正在迭代HashSet,执行具有FOO副作用的操作,我得到了这个异常.我该如何正确地做到这一点?" (2认同)