我的理解是C#在某种意义上HashSet和set类型上都有.我明白什么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其中检索操作.这与集合作为操作的想法无关.
试想一下,而不是关键字实际上是fetch和assign,如
// 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部分.
那更清楚吗?