代码之家  ›  专栏  ›  技术社区  ›  ilya n.

为什么用C#设置HashSet而不设置?

  •  24
  • ilya n.  · 技术社区  · 16 年前

    老问题

    我的理解是C#在某种意义上 HashSet set 类型。我明白了 是但为什么呢 是一个单独的词吗?为什么不是每套都是 HashSet<Object> ?

    为什么C#没有泛型 Set Dictionary 类型在我看来,我希望有一套标准的查找/添加/删除性能。我不太在乎它是通过哈希还是其他方式实现的。那么,为什么不创建一个集类来实际实现为 哈希集 在这个版本的C#中,但在未来的版本中可能会有所不同?

    或者为什么不至少是界面 ISet ?

    答复

    感谢所有回答以下问题的人: ICollection 实现了许多您所期望的 伊塞特 . 但在我看来, I收集 工具 IEnumerable

    好的,我想我明白了。 绝对是应该被召唤的 设置 设置 在某种意义上,它是保守的。更具体地说,.NET体系结构的创建者希望为不同的语言提供一组一致的类(原文如此)。这意味着标准类的每个名称不得与.NET语言中的任何关键字一致。字眼 设置 ,但是,在VB.NET中使用,它实际上是不区分大小写的(是吗?),所以不幸的是,那里没有maneuvre的空间。

    谜团解开:)

    Alex Y.的新答案链接到 MSDN page 它描述了即将推出的.NET4.0接口 伊塞特 它的行为和我认为的差不多,由 HashedSet . 快乐的结局。

    7 回复  |  直到 16 年前
        1
  •  19
  •   Jon Skeet    16 年前

    (你最初的问题是关于 set 答案是肯定的。IIRC,“set”是英语中含义最为不同的词。。。显然,这对计算也有影响。)

    我觉得吃点东西很好 HashSet<T> 有这个名字,但我当然欢迎 ISet<T> 界面鉴于此 HashSet<T> LinkedHashSet ,它保持插入顺序,在某些情况下会很有用。

    说句公道话 ICollection<T> 界面实际上涵盖了您想要的大部分内容 ISet<T> ,所以这可能不是必需的。然而,您可能会争辩说集合的核心目的(主要是关于包含,仅与能够迭代元素相关)与集合不完全相同。这很棘手。事实上,一个真正的数学集合可能不是可数或可数的——例如,你可以有“介于1和2之间的实数集合”。如果你有一个任意精度的数字类型,那么计数将是无限的,对它进行迭代将毫无意义。

    同样,“添加”到集合中的想法并不总是有意义的。命名集合时,易变性是一个棘手的问题:(

    编辑:好的,回复评论:关键字 设置 设置 get 哪一个 检索 手术。这与集合作为操作的思想无关。

    想象一下,关键字实际上是 fetch assign

    // Not real code!
    public int Foo
    {
        fetch
        {
            return fooField;
        } 
        assign
        {
            fooField = value;
        } 
    }
    

    目的明确吗?现在 真实的

    public int Foo
    {
        get
        {
            return fooField;
        } 
        set
        {
            fooField = value;
        } 
    }
    

    所以如果你写:

    x = y.Foo;
    

    这将使用

    y.Foo = x;
    

    这将使用 设置 部分

        2
  •  6
  •   Alex Yakunin    16 年前

    造成这种情况的唯一原因似乎是缺乏资源,无法在.NET3.5中理想地实现这一点。

    ISet ,以及除 HashSet - SortedSet . 查看提供的指向MSDN库的链接-它们已在.NET 4.0 beta1中提供。

        3
  •  5
  •   ScottS    16 年前

    没有定案 <T> . 这 BCL team Blog post 有很多关于HashSet的细节,包括关于在名称中包含hash的不完全决定性的讨论。我怀疑BCL团队中不是每个人都喜欢使用HashSet这个名称的决定 < .

        4
  •  4
  •   Mark Seemann    16 年前

    set 是自1.0版以来一直存在的C语言关键字。用于定义特性的赋值部分(和 get

    HashSet<T> 是集合的数学概念的具体实现。它最初是在.NET3.5中引入的。BCL团队的这篇博客文章解释了更多关于它背后的原因,以及为什么这个名字是 HashSet<T> Set<T> : http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing-hashset-t-kim-hamilton.aspx

    HashSet<T>

        5
  •  3
  •   Oleksii G.    16 年前

    Set是VB.NET中的保留关键字(它与C#中的Set等效)。VB.NET可以使用与关键字同名的类/方法/等,但它们必须写在方括号内,这很难看:

    Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
    Public Class Test
        Private _myValue As Integer  
    
        Public Property MyValue() As Integer
            Get
                Return _myValue
            End Get
            Set ' Set as keyword'
                _myValue = value
            End Set
        End Property
    
        Public Function X As [Set](Of Integer)
            Dim a As New [Set](Of Integer) ' Set as class'
            Return a
        End Function
    
    End Class
    
        6
  •  2
  •   Community Mohan Dere    5 年前

    啊,对了,我现在明白你的问题了
    我不确定我是否能100%看到需要一个 ISet<T> .

    是否添加、删除、包含等。如果是,则 ICollection<T>
    如果它设置了诸如联合、交叉等的操作,那么你会认为一些通用性足以抽象出合同形式的强制执行吗?

    我不得不说,我不知道这个问题的正确答案——我认为这是一个值得讨论的问题,我怀疑BCL团队可能会在未来的版本中推出类似的东西,但这取决于他们。我个人并不认为这是一个巨大的功能缺失

    BCL根本没有集合,至少据我所知没有。
    Iesi.Collections
    HashSet<T> 退房 this link

    您通常会在以前必须使用的地方使用它 List<T> 并在添加时检查重复项。
    将项目添加到 HashSet<T> 也可以 significantly faster 比名单


    HashSet的另一个很好的特性是,如果您尝试添加一个重复项,它不会引发异常,只是无法添加重复项,这就省去了在每次添加时都要放置大量try.catch块的麻烦-nice:)

        7
  •  0
  •   Noldorin    16 年前

    我很确定没有 Set<T>

    HashSet<T> 本身只是一个使用哈希代码的普通集合数据结构( GetHashCode