C#中利用HashSet代替List

来源:新浪博客     2015-12-11 14:01:54    人气:     我有话说( 0 人参与)

清泛网(www.tsingfun.com):C#需要存储一个集合,然后判断集合是否已包含某元素等等。我相信大部分人会选择使用List,当然没有问题,但是若集合数据量很大,这时就要考虑性能问题了,HashSet刚好派上用场,而且性能提升不只一点点哟~~~

.NET3.5多了个HashSet<T>用来存储集合。从名称可以看出,它是基于Hash的。可以简单理解为没有Value的Dictionary<TKey,TValue>。

HashSet<T>不能用索引访问,不能存储重复数据,元素T必须正确实现了Equals和GetHashCode。

那它的优势是什么呢?

检索的性能。简单的说它的Contains方法的性能在大数据量时比List<T>好得多。HashSet<T>的Contains方法复杂度是O(1),List<T>的Contains方法复杂度是O(n)。

那么,在集合的目的是为了检索的情况下,我们应该使用HashSet<T>代替List<T>。比如一个存储关键字的集合,运行的时候通过其Contains方法检查输入字符串是否关键字。

HashSet<T>是专门设计用来做集合运算(取交集,并集等),所以提供了UnionWith、IntersectWith等方法。

另:如果数据量很小,那么仍然推荐使用List<T>。
这个“小”是多小呢?其实是用Hashtable还是ListDictionary时存在同样的取舍问题,.NET为其设计了HybridDictionary类实现一个混合容器,当数量小于等于8(目前是8,不保证微软以后不会变)的时候,HybridDictionary内部使用ListDictionary,当数量大于8的时候,HybridDictionary内部使用Hashtable。所以,如果我们知道我们集合的数量不会大于8的话,就算目的是为了检索,任然推荐使用List<T>。

C# List HashSet

本文源自互联网,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,
版权归原作者,如有问题请联系service@tsingfun.com (编辑:admin)