C#2.0--集合--转载车老师

时间:2022-09-01 16:57:33

集合在编程的过程中用的是非常的多,如GridViewRowCollection、ConnectionStringSettingsCollection、NameValueCollection等等。一般来说,集合的类都包含在System.Collections命名空间中。那众多集合之间又有什么样的联系呢?这需要我们从集合的集成关系上理顺一下。

C#2.0--集合--转载车老师

一、IEnumerable和IEnumerator接口
    IEnumberable接口是大部分集合类型的根。它是一个支持foreach迭代的接口,一个集合对象要能遍历所有对象的话,那它必需要实现这个接口,它的声明结构如下:
        public interface IEnumerable
        {
            IEnumerator GetEnumerator ();
        }
    其中的GetEnumerator方法返回的是IEnumerator类型,可以用返回的IEnumerator类型结果实现对集合内容的向前遍历。
    IEnumerator接口的声明如下:
public interface IEnumerator
       {
Object Current { get; }     //获取集合中的当前元素。
bool MoveNext ();             //如果枚举成功推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
void Reset () ;                    //将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。   
}
    如在HashTable中用IEnumerator遍历数据(关于Hashtable后面会有介绍):
        Hashtable h = new Hashtable();
        h.Add("a","aaaa");
        h.Add("b", "bbbb");
        IEnumerator ie = h.GetEnumerator();
        while (ie.MoveNext())
        {
            Console.Write(((DictionaryEntry)ie.Current).Key + "\t" + ((DictionaryEntry)ie.Current).Value+"\n");
        }
二、ICollection接口
    ICollection接口派生自IEnumerable接口,扩展了集合元素个数和同步功能(对多线程安全访问的支持)。
    ICollection接口的声明:
public interface ICollection : IEnumerable
       {
int Count { get; }          //ICollection集合中元素的个数
bool IsSynchronized { get; }   //获取是否同步对ICollection 的访问。
Object SyncRoot { get; }     //获取用于同步ICollection访问的对象。

       所有实现ICollection接口的对象,可以在对集合元素遍历的时候,把集合锁定,以防其它线程(用户)对集合的修改。
        ArrayList al = new ArrayList();
        al.Add("aaa");
        al.Add("bbb");
lock (al.SyncRoot)
        {
            for(int i=0;i<al.Count;i++)
            {
                Console.WriteLine(obj);
            }
        }
    ICollection接口派生了IDictionary和IList两个子接口。
三、IList接口
    IList是一个值的集合,派生自ICollection,其成员可以通过索引访问。如ArrayList
    IList接口的声明:
public interface IList : ICollection, IEnumerable
        {
            int Add(object value);      //将某项添加到IList集合中
            void Clear ();      //从 IList 中移除所有项。
            bool Contains (Object value);    //确定 IList 是否包含特定值。
            int IndexOf (Object value); //取得IList集合中指定项的索引号。
            void Insert (int index,Object value); //将一个项插入IList集合的指定索引处。
            void Remove(object value);   //从IList集合中移除指定的项对象。
            void RemoveAt(int index); //从IList集合中移除指定索引项的对象。
            bool IsFixedSize { get; } //指示IList 是否具有固定大小。大小固定的集合在创建之后不允许添加或移除元素,但允许修改现有元素。
            bool IsReadOnly { get; } //IList 是否为只读。只读集合在创建之后不允许添加、移除或修改元素。
            Object this [int index] { get; set; } //获取或设置指定索引号元素的内容。可以使用此索引器实现集合元素的循环遍历。
}

四、IDictionary接口
    IDictionary接口实现一个“键/值”对的集合,派生自ICollection,可以用循环遍历其中的每一个元素。其中的每个"键/值"对是一个DictionaryEntry 对象,只能用键名来存取对象,不能用索引号来存取对象。如HashTable
    iDictionary接口的声明:
public interface IDictionary : ICollection, IEnumerable
        {
            void Add (Object key,Object value); //在IDictionary集合中添加键和值对元素。
            void Clear ();      //从 IList 中移除所有项。
            bool Contains (Object value);    //确定 IList 是否包含特定值。
            IDictionaryEnumerator GetEnumerator (); //返回一个用于 IDictionary 集合的 IDictionaryEnumerator 对象。
            void Remove (Object key);     //从集合中移除指定键值的元素
            bool IsFixedSize { get; } //指示IList 是否具有固定大小。大小固定的集合在创建之后不允许添加或移除元素,但允许修改现有元素。
            bool IsReadOnly { get; } //IList 是否为只读。只读集合在创建之后不允许添加、移除或修改元素。
           Object this [Object key] { get; set; } //获取或设置具有指定键的元素。
            ICollection Keys { get; } //获取IDictionary中的所有的键集合。
            ICollection Values { get; }   //获取IDictionary中的所有的值集合。
        }

五、ArrayList类
    ArrayList类实现了IList接口,用来存储非泛型对象。
Count属性:集合中实际元素的个数。
Capacity属性:ArrayList空间的大小。生成一个ArrayList对象的时候默认分配了4个元素的空间(默认),在添加前4个元素的时候Capacity始终是4。当添加第5个元素的时候,首先框架会把ArrayList的Capacity的容量加倍,然后再把第5个元素存入。
        void AddRange (ICollection c):将一个新的ICollection对象加到当前ArrayList后面,通常用来拼接两个ArrayList。
        ArrayList GetRange (int index,int count):从当前的ArrayList对象中返回指定位置和指定数目的元素,并将这些元素以新的ArrayList对象形式返回。
        void InsertRange(int index,ICollection c) :在指定的位置插入另一个ICollection对象。
        void TrimToSize():将ArrayList的容量缩减到ArrayList的实际的元素个数。
        void Reverse() :将数组的顺序进行返转。
        void Sort():将数组进行排序。
六、Hashtable类:
    Hashtable实现了IDictionary接口,可以用来存储非泛型对象。由于Hashtable实现的是IEnumerable接口,所以可以用foreach对Hashtable进行遍历。
        void ContainsKey(object o)   //判断Hashtable 是否包含指定键。
        void ContainsValue(object o)    //判断Hashtable是否包含指定的值。
        Hashtable Hashtable.Synchronized (Hashtable t) //静态方法,将一个普通的Hashtable包装为一个同步的(线程安全)Hashtable。
    用IEnumerator对Hashtable进行显示:
        Hashtable h = new Hashtable();
        h.Add("a","aaaa");
        h.Add("b", "bbbb");
IEnumerator ie = h.GetEnumerator();
        while (ie.MoveNext())
        {
            Console.Write(((DictionaryEntry)ie.Current).Key + "\t" + ((DictionaryEntry)ie.Current).Value+"\n");
        }
    用foreach来实现对Hashtable的迭代显示:
        Hashtable h = new Hashtable();
        h.Add("a","aaa");
        h.Add("b", "bbb");
foreach (DictionaryEntry d in h)
        {
            Console.WriteLine(d.Key+"\t"+d.Value);
        }
    由于Keys和Values也是ICollection集合,所以也要以用foreach分别对Keys和Values集合进行迭代
        Hashtable h = new Hashtable();
        h.Add("a","aaa");
        h.Add("b", "bbb");   
        foreach (object var in h.Keys)
        {
            Console.WriteLine(var);
        }
        foreach (object var in h.Values)
        {
            Console.WriteLine(var);
        } 
七、SortedList类:
    SortedList与散列表一样也是一个"键/值"对的集合,但它是按照关键字进行排序的,其值是可以通过数字索引来处理。 
             object GetKey(int index)://根据索引号来取得指定位置的键。
             object GetByIndex(int index)://根据索引号来取得指定位置的值。
             IList GetKeyList()://获取SortedList中的键的集合。
             IList GetValueList()://获取SortedList中的值的集合。
             object IndexOfKey(object var)://取出SortedList中指定键的索引号。
             object IndexOfValue(object var)://取出SortedList中指定值的索引号。
    用索引号遍历SortedList中的每个元素
            SortedList h = new SortedList();
            h.Add("a","aaa");
            h.Add("d","ddd");
            h.Add("f", "fff");
            h.Add("e", "eee");
            h.Add("c","ccc");
            h.Add("b", "bbb");           
            for (int i = 0; i < h.Count; i++)
            {
                Console.WriteLine(h.GetByIndex(i)+"\t"+h.GetKey(i));
            }
       从输出的结果中,我们会发现其中的元素会按照key的顺序进行排序的。
       GetKeyList()和GetValueList()返回的都是IList类型的数据,所以我们也可以使用foreach对二者的返回结果进行迭代:
            SortedList h = new SortedList();
            h.Add("a","aaa");
            h.Add("d","ddd");
            h.Add("f", "fff");
            h.Add("e", "eee");
            h.Add("c","ccc");
            h.Add("b", "bbb");
            foreach (object var in h.GetKeyList())
            {
                Console.WriteLine(var);
            }
            foreach (object var in h.GetValueList())
            {
                Console.WriteLine(var);
            }
八、Queue类和Stack类
    这两个类都实现了ICollection接口和IEnumerable接口,但没有实现IList接口。
    Queue:队列,先进先出。
Enqueue(object var):入队
        object Dequeue() :出队
        object Peek():返回队首的元素,但不移除
       出队和入队都分影响Queue对象的元素的个数,即影响其Count属性。
            Queue q = new Queue();
            q.Enqueue("aaa");
            q.Enqueue("bbb");
            q.Enqueue("ccc");
            for (int i = 0; i < 3; i++) //这里用的是i<3而不是i<q.Count,因为Dequeue的过程中会影响q.Count。
            {
                Console.WriteLine(q.Dequeue());
            }
    Stack:堆栈,先进后出。
Push(object var): //进栈
        object Pop() : //出栈
        object Peek(): //返回栈顶元素,但不移除
        入栈和出栈都会影响Stack的元素个数。
            Stack s = new Stack();
            s.Push("aaa");
            s.Push("bbb");
            s.Push("ccc");
            for (int i = 0; i < 3; i++) //这里用的是i<3而不是i<s.Count,因为Pop的过程中会影响s.Count。
            {
                Console.WriteLine(s.Peek());
            }
九、ListDictionary类、HybridDictionary类和StringDictionary类
    这三个类都实现了IDictionary接口,属于System.Collections.Specialized 命名空间。
ListDictionary类对于10个或10个以下集合元素的性能非常高,但对于元素个数很大的集合性能欠佳。
HybridDictonary类在集合较小时,使用 ListDictionary 来实现 IDictionary,然后当集合变大时,切换到 Hashtable。
StringDictonary类是一个键和值都是强类型化为字符串的散列表。
    这三个类和Hashtable一样,既可以用foreach进行迭代也可以用IEnumerator进行遍历。

十、StringCollection类
    实现了IList接口,System.Collections.Specialized 命名空间。
    类似于只包含字符串的、强类型化的ArrayList。可以通过Foreach迭代,通过数字索引访问。

十一、NameValueCollection类
    类似于有序的字符串值和字符串键的集合,它并没实现IDictionary接口。
        string[] AllKeys属性:所有键的字符串数组。
        bool HasKeys():集合对象中是否包含"键/值"对。
        string Get(int index/string key):根据索引号或键名来取得元素的值。
        string GetKey(int index):根据索引号取得键名。
       对NameValueCollection集合对象的遍历:
            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("a", "aaa");
            nvc.Add("b","bbb");
            nvc.Add("c","ccc");
            foreach (string s in nvc.AllKeys)
            {
                Console.WriteLine(nvc[s].ToString());
            }

(车延禄)

收藏于 2007-11-20

C#2.0--集合--转载车老师的更多相关文章

  1. yii2&period;0 集合七牛SDK 上传图片到第三方

    首先,请用composer下载七牛phpSDK (具体参考官方文档) composer require qiniu/php-sdk 注册七牛账号 获取 AK SK(密匙) ,创建资源对象 获取doma ...

  2. asp&period;net2&period;0安全性&lpar;2&rpar;--用户个性化设置&lpar;2&rpar;--转载来自车老师

    上一篇我们用Profile.age等方式可以读取用户的年龄和其它的信息,但有的时候我们要查询显示所有用户的信息,但asp.net没有提供查询所有用户信息的功能,我们只能对现有的用户逐一查询其Profi ...

  3. asp&period;net2&period;0安全性&lpar;1&rpar;--用户角色篇&lpar;类&rpar;--转载来自车老师

    Membership.MembershipUser和Roles类 用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理, ...

  4. asp&period;net2&period;0安全性&lpar;4&rpar;--Login系列控件--转载来自车老师

    前面主要说了与安全相关的一系列的类,现在我们使用这些类就可以做出我们自己的安全系统了.其实微软的目的远不至于此,下面我们就来看一下微软为我们提供的Login系列控件. Login系列控件是微软为了简化 ...

  5. asp&period;net2&period;0安全性&lpar;2&rpar;--用户个性化设置&lpar;1&rpar;--转载来自车老师

    在Membership表中可以存储一些用户的基本信息,但有的时候,我们需要记录的用户信息远远不止Membership表中提供的这些,如QQ.MSN.家庭住址.联系电话等等.那如何把这些用户信息记录到数 ...

  6. asp&period;net2&period;0安全性&lpar;3&rpar;--验证与授权--转载来自车老师

    "验证"与"授权"是对网页资源安全管理的两道门. 验证(Authentication):检查用户是否是合法的用户.就像是网站大门口的保卫,服责验证使用的用户名和 ...

  7. asp&period;net2&period;0安全性&lpar;1&rpar;--用户角色篇&lpar;代码实现1&rpar;--转载来自车老师

    创建用户: MembershipCreateStatus mc; Membership.CreateUser(txtUid.Text, txtPwd.Text, txtEmail.Text, txtQ ...

  8. asp&period;net2&period;0安全性&lpar;1&rpar;--用户角色篇&lpar;代码实现2&rpar;--转载来自车老师

    加载所有用户 MembershipUserCollection user = Membership.GetAllUsers(); listUser.DataSource = user; listUse ...

  9. asp&period;net2&period;0安全性&lpar;1&rpar;--用户角色篇&lpar;起篇&rpar;--转载来自车老师

    安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾.在.net2.0中微软为 ...

随机推荐

  1. PHP学习-链接数据库

    链接数据库文件:conn.php <?php $conn = mysql_connect("localhost:3306","root","us ...

  2. 深入理解C&plus;&plus;虚函数表

    虚函数表是C++类中存放虚函数的一张表,理解虚函数表对于理解多态很重要. 本次使用的编译器是VS2013,为了简化操作,不用去操作函数指针,我使用到了VS的CL编译选项来查看类的内存布局. CL使用方 ...

  3. latex figure &bsol;label 放在&bsol;caption 后

    http://www.cnblogs.com/loca/p/4264686.html latex figure \label 放在\caption 后,否则将显示\section 或者\subsect ...

  4. 面试题&lowbar;89&lowbar;to&lowbar;92&lowbar;单元测试 JUnit 面试题

    89)如何测试静态方法?(答案)可以使用 PowerMock 库来测试静态方法. 90)怎么利用 JUnit 来测试一个方法的异常?(答案) 91)你使用过哪个单元测试库来测试你的 Java 程序?( ...

  5. PHP实现获得一段时间内所在的所有周的时间

    function getWeek($startdate,$enddate) { //参数不能为空 if(!empty($startdate) && !empty($enddate)){ ...

  6. linux内存操作--ioremap和mmap学习笔记

    最近做一些相关的视频输出,对于保留framebuffer内存使用情况不是很清楚,现在找了一些资料整理出,准备使用.if (希望看到使用)  goto   用法: 对于一个系统来讲,会有非常多的外设,那 ...

  7. java--照片和BYTE这些东西阵列

    使用java,图像被变换成BYTE排列.和该阵列为图象,远程传输的图片进行 参考:http://blog.csdn.net/huang9012/article/details/18241539 代码例 ...

  8. 安装Linux内核源代码

    系统:Ubuntu 18 CPU架构:AMD64 1,在终端输入:sudo apt install linux-source 命令 2,进入/usr/src/linux-source-4.15.0目录 ...

  9. 深入理解Java虚拟机5-chap7-斗者2星

    一.类加载机制 1.类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Class文件加载到内存,这就是类加载机制. 2.类型 ...

  10. 第十二次作业 - Beta答辩总结

    目录 前言 项目的链接与宣传 项目总结 原计划 达成情况 原因分析 [ Beta 冲刺博客链接汇总] [燃尽图] Beta版本展示 使用说明 视频展示 图片展示 答辩总结 [团队中个人的贡献比例] [ ...