有人知道C#中是否有与Java的Set
集合相当的东西? 我知道您可以通过填充但忽略值来在某种程度上使用Dictionary
或HashTable
模仿集合,但这不是一种非常优雅的方法。
#1楼
HashSet<T>
数据结构:
.NET Framework 3.5中引入了框架类库的HashSet<T>
数据结构。 可以在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
。 由于我没有包括任何比较对象的特定方法,因此将添加所有元素而不会发生冲突。 这次将1,000个Person
对象添加到每个集合中以进行一次试用。 将3组1,000次试验的总时间取平均值。
Average time [ms]
----------------------------
HashSet<Person> 201
List<Person> 3,000
如您所见,使用对象时,运行时间的差异变得天文数字,这使得HashSet<T>
具有优势。
#2楼
我在Dictionary<T, object>
周围使用包装器,将null存储在值中。 这使O(1)在键上进行添加,查找和删除,并且所有意图和目的的行为都类似于集合。
#3楼
尝试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)集合未排序,并且不能包含重复的元素...
#4楼
如果使用的是.NET 3.5,则可以使用HashSet<T>
。 确实,.NET不能像Java那样满足集合。
Wintellect PowerCollections也可以提供帮助。
#5楼
我使用Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
很多OSS项目都使用了它,我首先在NHibernate中遇到它
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3161115