有谁知道Set
在C#中是否有与Java 集合相当的好处?我知道你可以使用a Dictionary
或者HashTable
通过填充而忽略值来模仿一个集合,但这不是一个非常优雅的方式.
如果您使用的是.NET 3.5,则可以使用HashSet
.确实,.NET不像Java那样适应集合.
该Wintellect的PowerCollections可以帮助太大.
该HashSet
数据结构:
Framework Class Library的HashSet
数据结构是在.NET Framework 3.5中引入的.可以在MSDN参考页面HashSet
上找到其成员的完整列表.
HashSet
在数学集之后或多或少地建模,这意味着:
它可能不包含重复值.
它的要素没有特别的顺序; 因此类型不实现IList
接口,但更基本ICollection
.因此,哈希集内的元素不能通过索引随机访问; 它们只能通过枚举器进行迭代.
某些设置功能,如Union
,Intersection
,IsSubsetOf
,IsSupersetOf
可供选择.当使用多组时,这些可以派上用场.
HashSet
和之间的另一个区别List
是调用哈希集的Add(item)
方法返回一个布尔值:true
如果项目已添加,false
否则(因为它已在集合中找到).
为什么不List
呢?
由于a HashSet
只是一组唯一对象,您可能想知道为什么它必须是一个数据结构.List
通过检查在添加对象之前是否在列表中找到对象,法线可以具有相同的行为.
简短的回答是速度.List
随着更多元素的添加,正常搜索变得非常慢.A HashSet
需要一种结构设计,以便快速搜索和插入速度.
基准:
让我们比较a HashSet
和a 的性能速度List
.
每个试验包括向每个集合添加0到9,999的整数.但是,mod 25适用于每个整数.Mod 25生成最大类型的项目25.由于添加了10,000个元素,因此强制发生400次冲突,使数据结构有机会使用其搜索算法.在10,000次试验后测量3次并取平均值.
不要过多关注测试的具体运行时间,因为它们依赖于我的硬件,但看看它们是如何相互比较的.
Average time [ms]
----------------------------
HashSet 2,290
List 5,505
现在让我们创建元素对象而不是基本类型.我写了一个快速Person
类有三个字段:Name
,LastName
,和ID
.由于我没有包含任何比较对象的特定方法,因此将添加所有元素而不会发生冲突.这次Person
为每次试验添加了1,000个对象进行单次试验.平均每组3次1,000次试验的总次数.
Average time [ms]
----------------------------
HashSet 201
List 3,000
正如您所看到的,运行时间的差异在使用物体时变得天文数字,使其变得HashSet
有利.
试试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 4.0或更高版本:
在您需要排序然后使用的情况下SortedSet
.否则,如果不这样做,则使用,HashSet
因为它O(1)
用于搜索和操作操作.虽然SortedSet
是O(log n)
搜索和处理操作.
我使用Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
它在许多OSS项目中使用,我首先在NHibernate中遇到它
我在a周围使用了一个包装器Dictionary
,在值中存储空值.这使得O(1)在键上添加,查找和删除,并且所有意图和目的都像集合一样.
在CodePlex上查看PowerCollections.除了Set和OrderedSet之外,它还有一些其他有用的集合类型,如Deque,MultiDictionary,Bag,OrderedBag,OrderedDictionary和OrderedMultiDictionary.
对于更多集合,还有C5通用集合库.