C#集合集合?
有谁知道在C#中是否有与Java的Set
集合相当的好处? 我知道你可以通过填充但忽略这些值来使用Dictionary
或HashTable
模拟一个集合,但这不是一个很好的方法。
试试HashSet:
HashSet(Of T)类提供了高性能的集合操作。 一个集合是一个不包含重复元素的集合,其元素没有特定的顺序。
HashSet(Of T)对象的容量是对象可容纳的元素的数量。 随着元素添加到对象,HashSet(Of T)对象的容量会自动增加。
HashSet(Of T)类基于数学集合模型,并提供与访问Dictionary(Of TKey,TValue)或Hashtable集合的键类似的高性能集合操作。 简单来说,HashSet(Of T)类可以被认为是没有值的Dictionary(Of TKey,TValue)集合。
HashSet(Of T)集合未排序并且不能包含重复元素...
如果您使用.NET 3.5,则可以使用HashSet<T>
。 确实,.NET并不像Java那样迎合集合。
Wintellect PowerCollections也可以提供帮助。
HashSet<T>
数据结构:
框架类库的HashSet<T>
数据结构是在.NET Framework 3.5中引入的。 其成员的完整列表可以在MSDN参考页面找到HashSet<T>
。
HashSet<T>
或多或少地建立在数学集之后,这意味着:
它可能不包含重复的值。
其要素并不是特定的顺序; 因此该类型不会实现IList<T>
接口,而是更基本的ICollection<T>
。 因此,散列集内的元素不能通过索引随机访问; 他们只能通过枚举器迭代。
某些设置的函数(如Union
, Intersection
, IsSubsetOf
, IsSupersetOf
可用。 这些可以在使用多套工具时派上用场。
HashSet<T>
和List<T>
之间的另一个区别是,调用哈希集的Add(item)
方法会返回一个布尔值:如果该项已添加,则返回true
否则返回false
(因为它已在集中找到)。
为什么不List<T>
?
由于HashSet<T>
仅仅是一个唯一对象的集合,所以您可能想知道为什么它必须是一个数据结构。 普通的List<T>
可以通过检查在添加它之前是否在列表中找到对象来具有相同的行为。
简短的答案是速度。 在添加更多元素时,通过正常List<T>
搜索非常缓慢。 HashSet<T>
需要一个结构设计,以便快速搜索和插入速度。
基准:
我们来比较HashSet<T>
与List<T>
的性能速度。
每个试验包括将0到9,999的整数加到每个集合中。 然而,mod 25应用于每个整数。 Mod 25使得项目的最大类型为25个。由于添加了10,000个元素,这迫使400个碰撞发生,给数据结构一个使用他们的搜索算法的机会。 在10,000次试验之后测量3次并平均。
不要太在意测试的具体运行时间,因为它们依赖于我的硬件,但要看看它们如何相互比较。
Average time [ms]
----------------------------
HashSet<T> 2,290
List<T> 5,505
现在让我们制作元素对象而不是基元类型。 我用三个字段写了一个快速的Person
类: Name
, LastName
和ID
。 由于我没有包含任何比较对象的具体方法,因此所有元素都将被添加而不会发生碰撞。 这次,1000 Person
对象被添加到每个集合以进行单个试用。 1000组试验的总次数平均为1000次。
Average time [ms]
----------------------------
HashSet<Person> 201
List<Person> 3,000
正如您所看到的,使用对象时,运行时间的差异变得天文数字,使得HashSet<T>
更有优势。
上一篇: C# Set collection?