我的理解是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.好结局.
我有一个包含多个整数列表的HashSet - 即 HashSet<List<int>>
为了保持唯一性,我目前不得不做两件事:1.手动循环现有列表,查找重复项SequenceEquals.2.对各个列表进行排序,使其SequenceEquals当前正常工作.
有一个更好的方法吗?是否存在可以提供给HashSet的现有IEqualityComparer,以便HashSet.Add()可以自动处理唯一性?
var hashSet = new HashSet<List<int>>();
for(/* some condition */)
{
List<int> list = new List<int>();
...
/* for eliminating duplicate lists */
list.Sort();
foreach(var set in hashSet)
{
if (list.SequenceEqual(set))
{
validPartition = false;
break;
}
}
if (validPartition)
newHashSet.Add(list);
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !