已排序的集合类型:System.Collections.SortedList 类、System.Collections.Generic.SortedList<TKey, TValue> 泛型类和System.Collections.Generic.SortedDictionary<TKey, TValue> 泛型类,它们都实现 IDictionary 接口,两个泛型类还实现了System.Collections.Generic.IDictionary<TKey, TValue>,与Hashtable类似每个元素都是一个键值对,但是它们以基于键的排序顺序维护元素,并没有哈希表的 O(1) 插入和检索特性。非泛型的枚举项是DictionaryEntry 对象,而两个泛型类型返回 KeyValuePair<TKey, TValue> 对象。它们最重要的重点是它们是按照System.Collections.IComparer实现或System.Collections.Generic.IComparer<T>的实现排好序的。SortedList允许我们通过索引和键访问,而SortedDictionary只能通过键访问,SortedList还更省内存。
队列和堆栈:就不多做介绍了,如果要临时存储数据,数据只在访问一次后就放弃,就可以使用这类集合。队列和堆栈的差别就在于访问的先后不一样,相信大家都很清楚了。他们也分别有各自的泛型版本和线程安全版本:System.Collections.Queue 类、System.Collections.Generic.Queue<T> 类和System.Collections.Concurrent.ConcurrentQueue<T>,System.Collections.Stack类以及 System.Collections.Generic.Stack<T> 和System.Collections.Concurrent.ConcurrentStack<T>。
Set集合:该类型集合的两个类型HashSet<T> 和 SortedSet<T>,都实现了ISet<T>接口。Set集合最接近于数学中的集合,专门用于实现了数学的Set操作,如并集、交集等运算。其中Hashset<T>没有排序,不能有重复元素,可以视为Dictionary<TKey,TValue>的不包含值的版本,基于哈希键提供高性能的Set运算。而SortedSet<T>提供排好序的Set操作的集合。这里要提的是有些集合也提供了Set运算的扩展方法和LINQ也提供的Set运算,不过它们都返回新 的IEnumerable<T>集合,而Set集合的Set操作都是修改当前集合,并且提供一个更大、更可靠的运算集合。
这并不是.net集合的全部,它还有位集合和专用集合。
位集合
它的每个元素是一个标识位,而不是对象。其中有BitVector32和BitArray。
BitVector32是一个结构,只能存储32位数据,可用来存储位标识或小整数,它是值类型,因此性能更好。
而BitArray是引用类型,它的容量始终与计数相同,可以通过Length属性来分配或删除元素。
专用集合
NameValueCollection 基于 NameObjectCollectionBase;但NameValueCollection 接受一键多值,而 NameObjectCollectionBase 只接受一键一值。
System.Collections.Specialized 命名空间中的一些强类型集合包括 StringCollection 和 StringDictionary,它们都包含完全是字符串的值集合和字典。
CollectionsUtil 类提供一系列静态方法可以用来创建不区分大小写的Hashtable或SortedList集合的实例。
有些集合可以转换。例如,HybridDictionary 类起初是 ListDictionary,增大后就变为 Hashtable。
另外,KeyedCollection<TKey, TItem> 是介于列表和字典之间的混合类型,它提供了一种存储包含自己键的对象的方法,当元素数目达到指定阈值时,它也可以创建查找字典。
ListDictionary:使用单向链接列表实现 IDictionary。建议为通常包括少于 10 个项目的集合,当数据项较少时,提供比Hashtable更好的性能。
LINQ to Objects
我们可以使用 LINQ 查询来访问内存中的实现了System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口对象。
它提供了一种通用的数据访问模式;与标准 foreach 循环相比,它通常更加简洁,可读性更高;提供了强大的筛选、排序和分组功能。
如何抉择
我们首先要明确,如果存在泛型版本,优先使用。
选择之前请先确定几个问题:
是否需要按序列访问,元素在访问后放弃?
访问的顺序是先进先出或后进先出、随机访问?
是基于索引的访问,还是基于键的访问?
是只有值,还是键值对形式?
是一对一,还是一对多?
是否允许重复?
是按进入的顺序保存,还是需要按一定的规则排好序的,还是无所谓?
是否需要更快速度的检索和访问?
您可能感兴趣的文章: