用HashSet<T>代替List<T>

.NET3.5多了个HasSet<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>。

posted @ 2009-05-26 15:40  朱才  阅读(9443)  评论(16编辑  收藏  举报