.NET集合该怎么理解,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联始终坚持【策划先行,效果至上】的经营理念,通过多达十多年累计超上千家客户的网站建设总结了一套系统有效的推广解决方案,现已广泛运用于各行各业的客户,其中包括:发电机维修等企业,备受客户称扬。
集合是一些有共同特征的独立数据项组成的,通过集合,我们可以可以使用相同的调用代码来处理一个集合的所有元素,而不用单独处理每一个单独的项。.net的集合诸如(System.Array类以及 System.Collections命名空间)数组、列表、队列、堆栈、哈希表、字典甚至(System.Data下)DataSet、DataTable,还有2.0中加入的集合的泛型版本(System.Collections.Generic和 System.Collections.ObjectModel),4.0中引入的有效线程安全操作的集合(System.Collections.Concurrent)。
面对这么多的集合,你了解各个集合有哪些优势,在一个特定的场景中使用哪个集合吗?下面试图探讨一下这个问题,泛泛而谈,不涉及深入的内存数据结构的追究。
集合接口
在分别讨论各种集合之前,我们先讨论一下集合的共性,整个集合体系的继承层次。
ICollection 接口是 System.Collections 命名空间中类的基接口,而相应的ICollection
ICollection又继承IEnumerable,来提供方便的枚举功能,不过更值得注意ICollection提供同步访问的线程安全性控制:
IsSynchronized:获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。
SyncRoot:获取可用于同步对 ICollection 的访问的对象。
例如,我们可以通过以下来对集合进行线程安全访问,不过有些集合提供Synchronized方法来提供线程安全集合的封装。
ICollection myCollection = someCollection; lock(myCollection.SyncRoot) { // Insert your code here.
}
不过默认情况下集合不是线程安全的。如果需要对集合进行可伸缩的且高效的多线程访问,请使用System.Collections.Concurrent命名空间中的某个类。
而与非泛型版本不同的是,泛型版本的集合除了实现了泛型的接口外,也实现了非泛型的相应的接口。如ICollection
微软推出了System.Collections.Concurrent集合,在这个命名空间里,开发了一批线程安全的对象,当然内核也类似于lock机制,但小微自己一定是做了不少优化的,这是我们能肯定的。
另外,IList和IDictionary分别继承自ICollection,IList的实现者(如Array、ArrayList 或 List
接下来,我们将分别讨论和比较下一些常用的集合。
数组Array
Array不是System.Collections的一部分,但是它继承自IList接口。.net的Array可以有多维数组、交错数组,甚至创建下限不是0是数组,默认情况下推荐使用下限是0的一维数组,这常用的数组是经过优化的,性能最高。
与System.Collections集合不同的是,Array具有固定的容量,若要增加容量,您必须创建具有所需容量的新 Array 对象,将旧 Array 对象中的元素复制到新对象中,然后删除该旧 Array。而System.Collections下的集合在达到当前容量时可自动扩充容量:内存被重新分配,元素从旧集合复制到新集合中。 这减少了使用集合所需的代码,但是,集合的性能可能仍受到消极影响。 因此我们应将初始容量设置为集合的估计的大小以避免因多次重新分配导致的不佳性能。
System.Collections下的集合类
该类型的集合都具有排序功能且大多数经过了索引。能自动处理内存管理,容量按需扩大。
ArrayList和List
Hashtable 和 Dictionary 集合类型:这些集合每个项是一个键值对。Dictionary
已排序的集合类型:System.Collections.SortedList 类、System.Collections.Generic.SortedList
队列和堆栈:就不多做介绍了,如果要临时存储数据,数据只在访问一次后就放弃,就可以使用这类集合。队列和堆栈的差别就在于访问的先后不一样,相信大家都很清楚了。他们也分别有各自的泛型版本和线程安全版本:System.Collections.Queue 类、System.Collections.Generic.Queue
Set集合:该类型集合的两个类型HashSet
这并不是.net集合的全部,它还有位集合和专用集合。
位集合
它的每个元素是一个标识位,而不是对象。其中有BitVector32和BitArray。
BitVector32是一个结构,只能存储32位数据,可用来存储位标识或小整数,它是值类型,因此性能更好。
而BitArray是引用类型,它的容量始终与计数相同,可以通过Length属性来分配或删除元素。
专用集合
NameValueCollection 基于 NameObjectCollectionBase;但NameValueCollection 接受一键多值,而 NameObjectCollectionBase 只接受一键一值。
System.Collections.Specialized 命名空间中的一些强类型集合包括 StringCollection 和 StringDictionary,它们都包含完全是字符串的值集合和字典。
CollectionsUtil 类提供一系列静态方法可以用来创建不区分大小写的Hashtable或SortedList集合的实例。
有些集合可以转换。例如,HybridDictionary 类起初是 ListDictionary,增大后就变为 Hashtable。
另外,KeyedCollection
ListDictionary:使用单向链接列表实现 IDictionary。建议为通常包括少于 10 个项目的集合,当数据项较少时,提供比Hashtable更好的性能。
LINQ to Objects
我们可以使用 LINQ 查询来访问内存中的实现了System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable
它提供了一种通用的数据访问模式;与标准 foreach 循环相比,它通常更加简洁,可读性更高;提供了强大的筛选、排序和分组功能。
如何抉择
我们首先要明确,如果存在泛型版本,优先使用。
选择之前请先确定几个问题:
是否需要按序列访问,元素在访问后放弃?
访问的顺序是先进先出或后进先出、随机访问?
是基于索引的访问,还是基于键的访问?
是只有值,还是键值对形式?
是一对一,还是一对多?
是否允许重复?
是按进入的顺序保存,还是需要按一定的规则排好序的,还是无所谓?
是否需要更快速度的检索和访问?
关于.NET集合该怎么理解问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
网页标题:.NET集合该怎么理解
地址分享:http://scgulin.cn/article/ijddoj.html