【问题标题】:Why use a List over a HashSet?为什么在 HashSet 上使用 List?
【发布时间】:2013-08-28 12:19:29
【问题描述】:

可能是一个显而易见的问题,但我已经看到了很多为什么要在列表/数组上使用 HashSet 的原因。 我听说它有 O(1) 用于删除和搜索数据。

我从未听说过为什么要在 HashSet 上使用列表。

为什么反之亦然?

【问题讨论】:

    标签: c# list hashset


    【解决方案1】:
    • 列表允许重复,HashSet 不允许
    • 列表按索引排序,HashSet 没有隐式顺序
    • 性能往往被高估,为工作选择合适的工具
    【解决方案2】:

    它们有不同的语义。列表是有序的(按插入顺序),允许重复,并按索引提供随机访问;哈希集是无序的,不允许重复(根据设计删除它们),并且不提供随机访问。两者都是完全有效的,简单地说:适用于不同的场景。

    【讨论】:

    • @Joey 到底怎么样?什么 API 允许这样做?它提供的只是“添加”、“删除”、“包含”。您实际上需要持有您正在寻找的东西。
    • @Joey 仅适用于Contains。遗憾的是,您不能重载相等/gethash 方法并通过使用“相似”项目来获取列表中的项目。
    • @Joey 你有没有可能想到Hashtable?这与 HashSet<T> 不同的 API。
    【解决方案3】:

    首先,您可以将重复项插入到列表/数组中。

    来自HashSet.Add Method

    返回值类型:

    System.Boolean

    如果元素被添加到 HashSet 对象,则为真;

    如果元素已经存在则返回 false。

    【讨论】:

      【解决方案4】:

      我参加聚会很晚了,但我想通过转过头来为所选答案添加一些内容:

      何时使用 HashSet 而不是 List?

      1. 当您在 Set 中的对象肯定是唯一的或者您不想添加重复项时。
      2. 您经常想查找某些对象是否在 Set 中。
      3. 如果您经常删除对象。添加对象与将对象添加到 List 所需的时间大致相同,但在 HashSet 中删除它们要快得多。
      4. 如果您不关心订单或通过索引直接访问。

      请记住,您也可以通过 HashSet “foreach”。

      Rango 说得对,性能有时被高估了;但是如果性能很关键(并且顺序不重要),HashSet 可以比 List 快很多。

      【讨论】:

        猜你喜欢
        • 2015-11-13
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2018-11-11
        • 2013-04-23
        • 1970-01-01
        相关资源
        最近更新 更多