C#集集合?

荒凉一梦 提交于 2020-02-28 09:27:36

有人知道C#中是否有与Java的Set集合相当的东西? 我知道您可以通过填充但忽略值来在某种程度上使用DictionaryHashTable模仿集合,但这不是一种非常优雅的方法。


#1楼

HashSet<T>数据结构:

.NET Framework 3.5中引入了框架类库的HashSet<T>数据结构。 可以在MSDN参考页上的HashSet<T>找到其成员的完整列表。

HashSet<T>或多或少地根据数学集合建模,这意味着:

  1. 它可能不包含重复值。

  2. 它的元素没有特定的顺序; 因此,该类型不实现IList<T>接口,而是实现更基本的ICollection<T> 。 结果,哈希集内的元素不能通过索引随机访问。 它们只能通过枚举器进行迭代。

  3. 某些集合函数(例如UnionIntersectionIsSubsetOfIsSupersetOf可用。 当使用多套时,这些可以派上用场。

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类: NameLastNameID 。 由于我没有包括任何比较对象的特定方法,因此将添加所有元素而不会发生冲突。 这次将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中遇到它

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!