我读到过在HashSet上迭代是不好的做法.我应该先调用.tolist()吗?

本文关键字:我应该 调用 tolist HashSet 迭代 | 更新日期: 2023-09-27 18:13:23

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

我对registreditems执行两种类型的操作:

  • 根据属性查找并返回项目。
  • 重复收集并产生副作用。

根据:我应该在什么时候使用HashSet

"遍历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上迭代是不好的做法.我应该先调用.tolist()吗?

如果您不关心顺序,请使用HashSet<>。这句话是关于当你担心顺序时使用HashSet<>是危险的。如果您多次运行此代码,并且以不同的顺序操作项,您会在意吗?如果没有,那么你很好。如果是,那么不要使用HashSet<>。首先任意地转换为List并不能真正解决问题。

我不确定,但我怀疑。tolist()将迭代HashSet<>来做到这一点,所以,现在您将遍历集合两次。

不要过早优化。如果您只有100个项目,只需使用HashSet<>,然后继续。如果你开始关心顺序,把它改成list <>然后,把它当作一个列表来使用。

如果你真的不关心顺序,并且你知道你不能在你的hashset中有重复(这是你想要的),那就继续使用hashset。

在引用的问题中,我认为他的意思是,如果你迭代一个Set,你可以很容易地欺骗自己,认为这些项是按照一定的顺序排列的。例如,以不同的方式对待第一个迭代项很容易,但不能保证它仍然是第一个迭代项。

只要记住这一点,并认为Set是无序的,迭代它是可以的。