为什么有HashSet但没有在C#中设置?

ily*_* n. 25 c# set hashset

老问题

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

新问题

为什么C#没有泛型Set类型,类似于Dictionary类型?从我的角度来看,我希望有一个具有标准查找/添加/删除性能的集合.我不关心它是用哈希还是别的来实现的.那么为什么不创建一个实际上HashSet在这个版本的C#中实现的集合类,但在将来的版本中可能有些不同?

或者为什么不至少接口ISet

回答

感谢所有在下面回答的人:ICollection实现了很多你期望的东西ISet.但是,从我的观点来看,ICollection实现IEnumerable虽然集合不必是可枚举的 - 例如:1到2之间的实数集合(更多,集合可以动态生成).我同意这是一个小咆哮,因为"普通程序员"很少需要不可数集.

好的,我想我明白了.HashSet绝对意味着被召唤,Set但这个词Set在某种意义上是保留的.更具体地说,.NET体系结构的创建者希望为不同的语言提供一致的集合(sic!).这意味着标准类的每个名称都不得与.NET语言中的任何关键字一致.Set然而,这个词在VB.NET中使用,它实际上是不区分大小写的(是吗?),所以遗憾的是那里没有空间可操作.

谜团已揭开 :)

结语

Alex Y.的新答案链接到MSDN页面,该页面描述了即将推出的.NET 4.0界面ISet,该界面的行为与我认为的应该完全相同并且由其实现HashedSet.好结局.

Jon*_*eet 19

(你原来的问题set已经得到解答了.IIRC,"set"这个词在英语中含义最多......显然这对计算也有影响.)

我认为拥有HashSet<T>这个名字很好,但我当然欢迎一个ISet<T>界面.鉴于HashSet<T>只有.NET 3.5(这本身就令人惊讶),我怀疑我们最终可能会获得更完整的基于集合的类型集合.特别是,LinkedHashSet维护插入顺序的Java的等价物在某些情况下会很有用.

公平地说,ICollection<T>界面实际上涵盖了你想要的大部分内容ISet<T>,所以也许这不是必需的.但是,您可能会认为集合的核心目的(主要是关于包容,并且只是关于能够遍历元素的切向)与集合不完全相同.这很棘手.事实上,一个真正的数学集可能不是可迭代的或可数的 - 例如,你可以拥有"1到2之间的实数集".如果你有一个任意精度的数字类型,计数将是无限的,迭代它将没有任何意义.

同样,"添加"到集合的想法并不总是有意义的.命名集合时,可变性是一项棘手的事情:(

编辑:好的,回应评论:关键字set绝不是与Visual Basic有关的遗产.这是其操作设置一个属性的值,VS get其中检索操作.这与集合作为​​操作的想法无关.

试想一下,而不是关键字实际上是fetchassign,如

// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}
Run Code Online (Sandbox Code Playgroud)

目的明确吗?现在真正相当于C#中的那个就是

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你写:

x = y.Foo;
Run Code Online (Sandbox Code Playgroud)

将使用get该属性的一部分.如果你写:

y.Foo = x;
Run Code Online (Sandbox Code Playgroud)

将使用该set部分.

那更清楚吗?


Sco*_*ttS 5

没有Set <T>.这个BCL团队博客文章有很多关于HashSet的详细信息,包括一个关于在名称中包含哈希的完全结论性讨论.我怀疑BCL团队中的每个人都不喜欢使用名称HashSet的决定<T>.


Ale*_*nin 5

唯一的原因似乎是缺乏在.NET 3.5中实现这一点的资源.

.NET 4.0将包括ISet,以及除HashSet - SortedSet之外的新实现.查看提供的MSDN库链接 - 它们已经在.NET 4.0 beta1中提供.