[转]迭代、集合、字典表和列表

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


一、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());
            }

转载于:https://www.cnblogs.com/ttltry-air/archive/2011/11/27/2264798.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟教程 之 HTML DOM 和 浏览器BOM

HTML DOM&#xff1a;https://www.runoob.com/js/js-htmldom.html 浏览器对象模型 (BOM)&#xff1a;https://www.runoob.com/js/js-window.html DOM、DOCUMENT、BOM、WINDOW 有什么区别? &#xff1a;https://www.zhihu.com/question/33453164 通过 HTML DOM&#xff0c;Ja…

IBM:物联网应重启,否则注定会失望

来源&#xff1a;IBM商业价值研究院摘要&#xff1a;尽管技术推动着物联网向前发展&#xff0c;但与此同时&#xff0c;缺少有吸引力且可持续盈利的商业模式将阻碍物联网的发展。如果未来的商业模式不同于目前硬件和软件平台的商业模式&#xff0c;那么&#xff0c;它是什么样的…

联通、华为《5G室内覆盖》白皮书!

来源&#xff1a;5G摘要&#xff1a;近日&#xff0c;中国联通、华为联合发布了《面向5G的室内覆盖数字化演进白皮书》。干货报告未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#…

JavaScript 执行机制

前端开发&#xff0c;一篇文章让你彻底搞懂&#xff0c;什么是JavaScript执行机制&#xff01;&#xff1a;https://zhuanlan.zhihu.com/p/139261821 大白话讲解 JavaScript 执行机制&#xff0c;一看就懂&#xff1a;https://www.jianshu.com/p/22641c97e351 JavaScript 运行…

互联网大脑进化简史,华为云EI智能体加入-2018年7月新版

要&#xff1a;华为云EI智能体是2018年以来产生的第八个类脑智能巨系统&#xff0c;在中国&#xff0c;目前除了小米、联想、今日头条&#xff0c;几乎所有的互联网巨头都提出了自己的”大脑“系统建设计划。1969年互联网诞生以来&#xff0c;网状模型一直是互联网最基础和重要…

Windows 必备神器 Cmder 使用教程

From&#xff1a;终端利器Cmder&#xff1a;https://www.e-learn.cn/topic/3885768 1. 安装 Cmder 打开 Cmder官网&#xff08; https://cmder.net &#xff09;&#xff0c;下拉页面找到 Download 项选择下载&#xff0c;下载的时候&#xff0c;两个版本&#xff0c;分别是 mi…

T-SQL查询进阶--流程控制语句

概述 和其他高级语言一样&#xff0c;T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解&#xff0c;本篇文章会系统的对T-SQL语句中的流程控制语句…

潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录

来源&#xff1a;澎湃网摘要&#xff1a;中国科学技术大学潘建伟教授及其同事陆朝阳、刘乃乐、汪喜林等通过调控六个光子的偏振、路径和轨道角动量三个自由度&#xff0c;在国际上首次实现18个光量子比特的纠缠&#xff0c;刷新了所有物理体系中最大纠缠态制备的世界纪录。中国…

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

From&#xff1a;Frida hook 常用函数分享&#xff1a;https://www.52pojie.cn/thread-1196917-1-1.html From&#xff1a;Frida Hook Android 常用方法&#xff1a;https://blog.csdn.net/zhy025907/article/details/89512096 Frida 使用&#xff1a;https://zhuanlan.zhihu.c…

资本|五大科技巨头并购投资布局分析

来源&#xff1a;199IT互联网数据中心就买进而言&#xff0c;科技巨头可能是一个理想的收购方。Alphabet、亚马逊、苹果、Facebook和微软拥有巨大的市场价值&#xff08;3.9万亿美元&#xff09;。综合来看&#xff0c;五大科技巨头在整个并购市场占有相对较小的份额。下图显示…

安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega

安装 Chrome 插件 3 种方法 方法 1&#xff1a;直接通过 chrome 插件商店安装&#xff0c;google 插件商店因为 "都懂的" 原因无法访问&#xff0c;如果会 "高科技" 上网可以忽略。直接通过插件商店安装方法 2&#xff1a;如果不会 "高科技" 上网…

数据库管理工具 Navicat 和 DBeaver

Navicat “Navicat” 是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库&#xff0c;例如阿里云、‎腾讯云。Navicat 和 Navicat …

百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市

来源&#xff1a;雷锋网去年 10 月&#xff0c;全球自动驾驶研发先行者 Waymo 发布了长达 43 页的安全报告&#xff0c;里面详细说明了如何装备和训练自动驾驶车辆&#xff0c;从而避免驾驶过程中一些意外情况的发生。今年 1 月&#xff0c;美国车企巨头通用也发布了“2018 自动…

Chrome Devtools 高级调试指南

From ( Chrome Devtools 高级调试指南 )&#xff1a;https://juejin.cn/post/6844903961472974855 chrome devtools 设置黑色主题&#xff1a;https://blog.csdn.net/sinat_15347975/article/details/81151342 Chrome DevTools 实用技巧大全&#xff08;收藏&#xff09;&…

包揽全球50%以上份额,中美发力超级计算

来源&#xff1a;第一财经摘要&#xff1a;中国已经成为全球拥有最多超级计算机的国家。根据上周发布的一份最新榜单&#xff0c;全球排名前500强的超级计算机中&#xff0c;有206台是中国研制的&#xff1b;而美国仅拥有124台。多年来&#xff0c;美国长期主导着超级计算机市场…

Fiddler 抓包工具总结

From&#xff1a;https://www.cnblogs.com/yyhh/p/5140852.html 官方文档&#xff1a;https://www.telerik.com/support/fiddler Fiddler 调式使用 (一) --- 深入研究&#xff1a;https://www.cnblogs.com/tugenhua0707/p/4637771.html Fiddler 实战 --- 深入研究(二)&#…

云计算行业报告:2018, 风起云涌

来源&#xff1a;物联网智库摘要&#xff1a;依托弹性扩展、费用低、速度快的优势&#xff0c;云计算颠覆了传统IT架构&#xff0c;未来将成为主流的IT架构。多优势助力云计算颠覆传统IT服务架构经过十几年的发展&#xff0c;云计算已经形成了较为完善的生态系统&#xff0c;构…

charles 简单使用

From&#xff1a;https://www.cnblogs.com/wenjun145/p/12995535.html 1、下载安装 1. 下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 2. 下载之后安装。按照默认next 即可&#xff0c;然后选择路径。 3. charles 。PJ&#xff1a;https://ww…

Facebook、谷歌、微软利用“黑暗模式”诱骗用户交出数据

来源&#xff1a;网络大数据摘要&#xff1a;挪威消费者委员会指出&#xff0c;Facebook、谷歌以及微软等科技巨头正在使用“黑暗模式”&#xff0c;或用户界面来诱骗用户交出自己的数据&#xff0c;以此推动用户被动选择不利于自身隐私保护的选项。据称&#xff0c;谷歌和Face…

Python 大规模异步新闻爬虫、google翻译、百度翻译、有道翻译、百度指数

参考&#xff1a;https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html url_pool.py # -*- coding: utf-8 -*- # Author : 佛祖保佑, 永无 bug # Date : # File : url_pool.py # Software: PyCharm # description : XXXimport time import redis import pick…