zoukankan      html  css  js  c++  java
  • C#语言各种集合介绍

    集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)
    一个集合包括多个元素,即有一个集合类对象和N个元素对象

    因为任何集合类都实现了IEnumerable接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象

    如果集合类是用户自定义的集合类,则用户必须实现它的GetEnumerator()方法,否则不能使用循环。当然,与这个自定义集合类对应的IEnumerator类(实现了该接口的类),也要自定义一个才行

    比如,ArrayList集合类对应的IEnumerator是 ArrayListEnumeratorSimple
                Array集合类对应的IEnumerator是 SZArrayEnumerator
          (这两个类在.net framework类库文档(msdn)中都没有介绍)

    1.System.Colloctions中表示集合的行为的接口有:
    1)ICollection
    定义所有集合的大小、枚举数和同步方法。派生于IEnumerable
    它定义了集合类最基本的行为,所有的集合类都实现了这个接口(基接口)
    但是它的行为太过基本:主要就是一个Count属性,单独实现它没有太大意义

    2)IEnumerable
    公开枚举数,该枚举数支持在集合上进行简单迭代
    它只有一个方法 GetEnumerator(),该方法可以返回一个IEnumerator接口,通过它可以遍历集合
    基本上所有的集合类都实现了这个接口

    3)IList
    IList实现是可排序且可按照索引访问其成员的值的集合,它本身实现了ICollection和IEnumerable接口
    是所有列表的抽象基类。IList 实现有三种类别:只读、固定大小、可变大小。

    4)IDictionary
    IDictionary实现是键/值对的集合,它本身实现了ICollection和IEnumerable接口
    是键/值对的集合的基接口。IDictionary 实现有三种类别:只读、固定大小、可变大小。
    IDictionary可称为字典、映射或散列表,它根据键(任意类型)来访问值


    2.System.Collections中可以直接使用的集合类有:
    1)ArrayList
    实现了接口:IList、ICollection、IEnumerable
    只要集合未被修改,ArrayList 就可安全地同时支持多个读取器
    随着向 ArrayList 中添加元素,容量通过重新分配按需自动增加(2倍增加)
    如果需要建立一个对象数组,但不能预先知道数组的大小,就可以使用ArrayList
    ArrayList把所有元素都当作object对象引用,因而在访问ArrayList的元素时要进行类型转换
    优点:动态改变大小、灵活方便的插入和删除元素、可排序
    缺点:插入时性能不如数组、不是强类型的

    2)BitArray
    实现了接口:ICollection、IEnumerable
    管理位值的压缩数组。

    3)Hashtable
    实现了接口:IDictionary、ICollection、IEnumerable
    可以向Hashtable中自由添加和删除元素,有些像ArrayList,但没有那么大的性能开销

    4)SortedList
    实现了接口:IDictionary、ICollection、IEnumerable
    SortedLIst兼顾了ArrayList和Hashtable的优点,可按键值来排序

    5)Queue
    实现了接口:ICollection、IEnumerable
    Queque是队列,先进先出的访问各个元素
    可以调用Queque对象的GetEnumerator()方法,得到IEnumerator对象,来遍历队列中的各个元素

    6)Stack
    实现了接口:ICollection、IEnumerable
    Stack是堆栈,后进先出的访问各个元素
    可以调用Stack对象的GetEnumerator()方法,得到IEnumerator对象,来遍历堆栈中的各个元素


    3.上面提到的几种集合类,他们都是通用的集合类,他们所接受的元素大都是Object类型,当对象放入
    了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型的
    解决办法是使用强类型的集合类
    System.Collections命名空间下的CollectionBase,DictionaryBase,ReadOnlyCollectionBase 类
    System.Collections.Specialized命名空间下的一些类可以满足要求,可以直接使用也可以继承

    4.集合性能

    许多集合类都提供了相同的功能,例如,SortedList与SortedDictionary的功能几乎完全相同。但是,其性能常常有很大区别。一个集合使用的内存少,另一个集合的元素检索速度快。在MSDN文档中,集合的方法常常有性能提示:O(1),时间与操作项时间一致。O(log n)

    随集合中元素的增加而增加,每个元素需要增加的时间不是线性的,而是呈对数曲线。

    集合                   Add                    Insert          Remove          Item           Sort                   Find

    List<T>   如果集合必须重置大小        O(n)              O(n)             O(1)       O(n log n),            O(n)

                  ,就是O(1)或O(n)                                                                    最坏情况O(n^2)

    Stack<T>Push(),如果窄必须重置                        Pop(),O(1)

                   大小 ,就是O(1)或O(n)

    Queue<T>Enqueue(),如果队列必须                    Dequeue(),   

                   重置大小,就是O(1)或O(n)                     O(1)

    HashSet<T>如果集必须重置大小,   Add()             O(1)                  

                    就是O(1)或O(n)             O(1)或O(n)

    LinkedList<T>AddLast()               AddAfter()      O(1)                                                        O(n)

    Dictionary      O(1)                                              O(1)           O(1)

    <TKey,TValue>               

    SortedDictionary

    <TKey,TValue> O(log n)                                     O(log n)    O(log n)

    SortedList                                                          O(n)          读写是O(log n),如果

    <TKey,Tvalue>                                                                   键在列表中,就是O(logn);

                                                                                              如果键不在列表中,就是O(n)

  • 相关阅读:
    JavaScript之判断参数的数值的详细类型
    JavaScript之不规则Table转化为可定点索引td节点的网格矩阵【插件】
    JavaScript之从浏览器一键获取教务处个人课程信息【插件】
    Linux之搭建远程数据库MySQL[Ubuntu:全过程]
    数据库之MySQL ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'" error【摘抄】
    Linux之常用命令【service】
    Linux之激活超级用户
    计算机网络之互联网|因特网|万维网|HTTP|HTML之间的关系辨析
    [转] Linux Shell 文本处理工具集锦
    可读写的缓冲设计表现
  • 原文地址:https://www.cnblogs.com/roucheng/p/3489327.html
Copyright © 2011-2022 走看看