C#集合类

转载 2012年03月22日 22:47:45

C#集合类

集合(collection)提供了一种结构化组织任意对象的方式,而且我们早就知道集合在日常编程工作中的重要性。.NET类库提供了丰富的集合数据类型,其种类之繁多甚至使许多人看得眼都花了,这些集合对象都具有各自的专用场合。不管怎么说,更多的选择也就意味着更高的灵活性,但同时也意味着更高的复杂性。因此,对集合各个类型的用途和使用条件具有适度的了解是完全必要的。下面就请随我进行一场.NET集合之旅吧!
.NET集合定义

从.NET 的角度看,所谓的集合可以定义为一种对象,这种对象实现一个或者多个System.Collections.ICollection、 System.Collections.IDictionary和System.Collections.IList接口。这一定义把 System.Collections名称空间中的“内置”集合划分成了三种类别:

    *  有序集合:仅仅实现ICollection接口的集合,在通常情况下,其数据项目的插入顺序控制着从集合中取出对象的的顺序。 System.Collections.Stack和 System.Collections.Queue类都是ICollection集合的典型例子。
    *  索引集合:实现Ilist的集合,其内容能经由从零开始的数字检索取出,就象数组一样。System.Collections.ArrayList对象是索引集合的一个例子。
    *  键式集合:实现 IDictionary 接口的集合,其中包含了能被某些类型的键值检索的项目。IDictionary集合的内容通常按键值方式存储,可以用枚举的方式排序检索。 System.Collections.HashTable类实现了IDictionary 接口。

正如你看到的那样,给定集合的功能在很大程度上受到特定接口或其实现接口的控制。如果你对面向对象编程缺乏了解,那么你可能对上面说的这些话感到难以理解。不过你至少应该知道,以接口这种方式构造对象的功能不但造就了具有整套类似方法的对象族,而且还能让这些对象在必要的情况下可以当作同类,以OOP (面向对象编程)的术语来说,这就是大名鼎鼎的多态性技术。


System.Collections概述:

System.Collections 名称空间包含了在你的应用程序中可以用到的6种内建通用集合。另一些更为专业化的集合则归属于 System.Collections.Specialized,在某些情况下你会发现这些专用集合也是非常有用的。加上一些异常(exception)类,这些专业化集合在功能上和内建集合是类似的。现在就让我们审视一下通用集合以及少量的不太富于专业化的集合。


堆栈和队列:

System.Collections.Stack 和 System.Collections.Queue 类,两者仅仅实现了ICollection 接口,按照存储项目加到集合的顺序保存System.Object类型的项目。对象只能按其加入顺序从集合中检索:堆栈是后进先出,而队列则是先进先出。通常情况下,你在以下场合可以考虑采用以上这些集合:

    *   接收和处理集合内项目时顺序比较重要。
    *   你能在处理项目之后丢弃它。
    *   你不需要访问集合中的任意项目。

ArrayList:

System.Collections.ArrayList 类,仅仅实现 Ilist,最适合描述为一种正常数组和集合的混合类型。ArrayList按照项目被加入集合的顺序存储项目。每个项目都被分配一个索引标识符而且能由关联它们的索引数字以任何顺序被检索。当新项目加入集合时会扩大ArrayList从而令其相比普通数组更具灵活性。然而,ArrayList负载比传统数组更大而且没有实现严格的类型化,也就可以接受任何转换为System.Object的对象(换句话说,对什么东西都来者不拒)。

SortedList:

System.Collections.SortedList,它实现了IDictionary和ICollection接口,是最基本的排序集合,与Vb6下的Collection对象非常类似。 SortedList存储对象并按照关联的键值对这些存储对象排序。它们也是同时支持索引数字和键对象检索的唯一内建的.NET集合。

HashTable:

强有力的System.Collections.HashTable集合实现了IDictionary 和 Icollection,能用来存储多种类型的对象连同关联的唯一字符串键值。在HashTable集合中的项目按照源自其键值的哈希代码所确定的顺序存储。集合内每个对象的键值都必须唯一,而其哈希代码则不一定唯一。
什么是哈希代码?哈希代码实质上就是从一快数据中消除所有冗余部分之后的结果,它主要起到对数据辅助分类或排序的作用。当某个项目加入集合时,HashTable即调用键值的GetHashCode方法,由于所有的类都是从System.Objec继承的,所以调用该方法即可确定该类的哈希代码并且按该代码排序存储。你可以强迫使用定制的哈希函数,方法有二,一是重载类的GetHashCode方法,二是向 HashTable构造器传递实现了System.Collections.IHashcodeProvider接口的对象,在这种情况下,该对象将用于为所有加入集合的键值产生哈希代码。

从性能的角度看,因为键值搜索仅限于具有同样哈希代码的键值,所以HashTable能够很快地从集合中检索任意一个元素,从而减少了必须通过检查以发现匹配的键值的数量。然而,因为插入到集合中的每个对象-键值对都必须产生相应的哈希代码,所以项目插入的代价就有点高了。因此,HashTable主要运用在按照任意键值反复检索大量相对静态的数据这一场合下。

ListDictionary 和 HybridDictionary:

ListDictionary 和 HybridDictionary 类归属于System.Collections.Specialized。它们都在按照唯一键值的原则来组织项目,而且都实现了 IDictionary 和 ICollection 。ListDictionary在内部以链表的方式存储项目,建议用在不会增长超过10个项目的集合中。HybridDictionary采用一个内部链表(实际上就是ListDictionary)作为小集合,当集合变得足够大(超过10个项目)以至于链表实现效率降低时就会转换为HashTable。

StringCollection 和 StringDictionary:

System.Collections.Specialized.StringCollection 和 System.Collections.Specialized.StringDictionary 都对存储字符串的集合进行了优化。 StringCollection实现了 IList 和 ICollection 而且实质上就是ArrayList,只不过实现了强烈的类型化仅仅接受字符串而已。StringCollection最理想的应用场合是经常更新或增加的少量数据,而StringDictionary则最适用于不经常增加项目到诸如HashTable之类集合中的大量数据。

NameValueCollection:

System.Collections.Specialized.NameValueCollection 最有趣的地方在于它能包含关联同一键值的多个项目,这正是它与其他内建集合的差别所在。除此以外,它在功能上类似HashTable,按照源自每一项目键值的哈希代码对项目排序从而也具有类同的优缺点。


存在的问题:

如果说由 .NET 类库所提供的内建集合也存在问题的话,那多半是它们几乎都在内部把项目存储为System.Object. 类型。从最大灵活性的角度看那是一个好想法,但同时也给采用这些通用集合的程序员提出了一些问题。首先,只要你把一个新项目加到集合中去,运行时就必须实施类型转换操作(创建值类型的索引以便可以当作对象引用)。这是一种低效的操作而且在处理大型集合时会产生相当可观的性能问题。其次,只要你访问通用集合中的一个项目,该项目都将作为System.Object类型被返回,这就意味着你不得不把它转换为真实的类型才能对其进行有意义的操作。

C#集合接口与集合类

C#开发经常用到.NET框架为我们提供的集合接口和集合类,接下来做一个总结,如有差错,希望各位大神指正。       首先是集合接口,自己画了一张图(嘿嘿,有点丑),来说明集合接口的继承关系。 ...
  • qb1688
  • qb1688
  • 2016年05月11日 00:43
  • 1016

通过C#实现集合类纵览.NET Collections及相关技术

概述:在真正的对象化开发项目中,我们通常会将常用的业务实体抽象为特定的类,如Employee、Customer、Contact等,而多数的类之间会存在着相应的关联或依存关系,如Employee和Cus...
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 15:21
  • 2145

c#集合类的线程安全(整理)

QueueT> 类 MSDN的说法 线程安全 此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不能保证任何实例成员是线...
  • wlanye
  • wlanye
  • 2013年03月13日 13:52
  • 14127

C#集合类(数据结构)

一、选择数据结构 1)线性容器 List数组/Stack/Dequeue按需求模型选择即可,LinkedList是双向链表增删修改快. 需要有序数组SortList线性排序容器都可以;如果既需要查找快...
  • Blues1021
  • Blues1021
  • 2015年10月04日 20:03
  • 5560

C# 并行集合类总结

System.Collections.Concurrent 命名空间提供多个线程安全集合类。当有多个线程并发访问集合时,应使用这些类代替 System.Collections 和System.Coll...
  • zeng_z
  • zeng_z
  • 2017年08月18日 10:48
  • 91

C# 集合类

  注意:本文汇总和整理自网上文章,主要来自于http://www.cnblogs.com/wf225/ System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、...
  • bobo_keke
  • bobo_keke
  • 2008年08月04日 13:46
  • 670

C#集合类

注意:本文汇总和整理自网上文章,主要来自于http://www.cnblogs.com/wf225/ System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列...
  • thinker28754
  • thinker28754
  • 2008年11月28日 15:52
  • 592

C#集合类

例一//DictionarySystem.Collections.DictionaryEntry dic=new System.Collections.DictionaryEntry("key1","...
  • wbuild
  • wbuild
  • 2007年10月03日 11:35
  • 1079

集合类 Java中的集合类解析和一些有深入的面试题

Java集合类解析 List、Map、Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存...
  • qq_33326449
  • qq_33326449
  • 2016年10月05日 23:39
  • 3138

c# 集合类

c#关于集合类分别哟两个命名空间: System.Collections 命名空间 定义各种对象(如列表、队列、位数组、哈希表和字典)的集合 System.Collections.Gene...
  • appppppen
  • appppppen
  • 2016年10月17日 16:42
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#集合类
举报原因:
原因补充:

(最多只允许输入30个字)