本篇将介绍关于集合的接口 这些接口定义了所有与集合有关的类的框架

IEnumerable接口

ns:System.Collections

此接口定义了对集合遍历的方法 一般表示元素序列或集合的类都实现了此接口 包括String类

IEnumerable接口的方法

GetEnumerator方法

获取一个用于遍历集合的枚举器 在许多遍历的应用中GetEnumerator方法被后台调用以实现foreach循环

IEnumerator接口

ns:System.Collections

此接口定义了一些属性与方法来遍历集合 表示一个集合枚举器

IEnumerator接口的属性

Current属性

获取当前正被枚举器所访问的元素

IEnumerator接口的方法

MoveNext方法

使枚举器指向集合中的下一个元素 并返回一个bool值 true表示顺利指向了下一个元素 false表示已达到集合末端

Reset方法

把枚举器重置到集合的最开始位置

 string str = "hello";
 IEnumerator tor = str.GetEnumerator();
 while (tor.MoveNext())
 {
     Console.WriteLine(tor.Current);
 }

最后注意 MoveNext方法只能遍历未做修改的集合 如果遍历集合后 在后来又修改了集合 再次遍历集合 则此方法将抛出异常 提示集合已修改 无法遍历 所以通常的做法是使用foreach循环

IDictionaryEnumerator接口

ns:System.Collections

此接口提供用于访问字典集合数据的方法 表示一个字典集合枚举器 此接口继承于IEnumerator接口

IDictionaryEnumerator接口的属性

Entry

获取一个表示集合中的某一个项的对象 该对象是一个DictionaryEntry类型

Key

获取集合中当前项的键

Value

获取集合中当前项的值

 Hashtable table = new Hashtable();
 table.Add(", "sam");
 table.Add(", "leo");
 IDictionaryEnumerator tor= table.GetEnumerator();
 while (tor.MoveNext())
 {
     Console.WriteLine("key:{0}   value:{1}",tor.Entry.Key,tor.Entry.Value);
 }

如果使用了MoveNext遍历集合后又修改了集合 再次遍历集合 则会抛出异常 最好改为foreach

 Hashtable table = new Hashtable();
 table.Add(", "sam");
 table.Add(", "leo");

 foreach (DictionaryEntry entry in table)
 {
     Console.WriteLine("key:{0}   value:{1}", entry.Key, entry.Value);
 }

 table.Add(","korn");

 foreach (DictionaryEntry entry in table)
 {
     Console.WriteLine("key:{0}   value:{1}", entry.Key, entry.Value);
 }

ICollection接口

ns:System.Collections

此接口提供了获取集合元素总数和复制集合元素到数组的方法 继承层次为:IEnumerable > ICollection

ICollection接口的属性

Count属性

获取集合元素总数

ICollection接口的方法

CopyTo方法

将集合中的元素拷贝到参数指定的数组中 可以通过参数2指定数组下标 表示集合中的元素要拷贝到数组的起始位置

IList接口

ns:System.Collections

此接口提供了以索引的方式访问集合元素的索引器 继承层次为:IEnumerable > ICollection > IList

IList接口的属性

this[index]索引器

通过集合元素的索引来取得元素

IList接口的方法

Add方法

将对象添加到集合

Clear方法

清除集合中所有项

Contains方法

集合中是否存在参数指定的元素

IndexOf方法

在集合中查找参数指定的元素 找到后返回元素的下标 找不到返回-1

Insert方法

将参数指定的元素插入到参数指定的下标处 如果指定的下标处已经存在x元素 则x元素及其后边的元素将向后移动

Remove方法

移除集合中由参数指定的元素 无论集合中是否存在多个相同的元素 只移除最先与参数匹配的元素

RemoveAt方法

移除集合中由参数指定的下标处的元素

IDictionary接口

ns:System.Collections

此接口提供了以键值对的方式访问集合元素的方法 继承层次为:IEnumerable > ICollection > IDictionary

IDictionary接口的属性

this[key]索引器

通过集合元素的key来取得元素的值

Keys属性

获取集合中所有元素的Key

Values属性

获取集合中所有元素的值

IDictionary接口的方法

Add方法

向集合中添加带有键值的项

Clear方法

清除集合中所有项

Contains方法

集合中是否存在参数指定的key

Remove方法

从集合中移除参数指定的项 如果元素从集合中移除 它的位置会被其他元素占位

IComparer接口

ns:System.Collections

此接口只定义了一个用于比较两个对象的Compare方法 它与IComparable接口的区别在于 IComparable提供的CompareTo方法只接收一个对象与调用该方法的对象做比较 而IComparer提供的Compare方法接收两个对象用于比较 此接口由Comparer、CaseInsensitiveComparer、KeysConverter(System.Windows.Forms)实现

集合接口的实现类

Stack类和Queue类实现了ICollection、IEnumerable、ICloneable接口

ArrayList类实现了IList、ICloneable接口

Hashtable类和SortedList类实现了IDictionary、ICloneable接口

另外还有CollectionBase类和DictionaryBase类 这两个类可以看成是两个关于集合的基类 但上面提到的集合类并非派生自CollectionBase或DictionaryBase 而是直接派生自Object 它们通过实现上面提到的接口来提供有关集合的操作 CollectionBase类和DictionaryBase类主要用于实现自定义的集合类 当内置的集合类不满足你的需求时 可以考虑派生CollectionBase类或者DictionaryBase类  下面的示例使用CollectionBase实现了自定义集合 并在自定义集合的Add方法中输出正被添加的元素

 public class MyList : CollectionBase
 {
     public void Add(string name)
     {
         base.List.Add(name);
         Console.WriteLine("添加了新项{0}", name);
     }

     public string this[int index]
     {
         get { return base.List[index].ToString(); }
         set { base.List[index] = value; }
     }
 }

 public static void Main(string[] args)
 {
     MyList list = new MyList();
     list.Add("sam");
     list.Add("leo");
 }

可以看到在Add方法内部是调用基类CollectionBase的List来添加项的 同样的也可以实现自定义的字典集合类 需要将其派生自DictionaryBase

 public class MyDictionary : DictionaryBase
 {
     public void Add(object Key,object Value)
     {
         base.Dictionary.Add(Key, Value);
         Console.WriteLine("添加了新项{0}", Value);
     }

     public string this[object Key]
     {
         get { return base.Dictionary[Key].ToString(); }
         set { base.Dictionary[Key] = value; }
     }
 }

 public static void Main(string[] args)
 {
     MyDictionary list = new MyDictionary();
     list.Add(,"sam");
     list.Add(,"leo");
 }

如果需要自定义泛型集合 则可以考虑实现IEnumerable<T> ……

C# - 学习总目录

C# - 集合类 - 集合接口的更多相关文章

  1. c#中常用集合类和集合接口之接口系列【转】

    常用集合接口系列:http://www.cnblogs.com/fengxiaojiu/p/7997704.html 常用集合类系列:http://www.cnblogs.com/fengxiaoji ...

  2. c#中常用集合类和集合接口之集合类系列【转】

    常用集合接口系列:http://www.cnblogs.com/fengxiaojiu/p/7997704.html 常用集合类系列:http://www.cnblogs.com/fengxiaoji ...

  3. Java 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

  4. 十四、C# 支持标准查询运算符的集合接口

    支持标准查询运算符的集合接口. System.Linq.Enumeralbe类提供的一些常用的API 来执行集合处理 1.匿名类型 2.隐匿类型的局部变量 3.集合初始化器 4.集合 5.标准查询运算 ...

  5. C#编程(四十七)----------集合接口和类型

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47005979 集合接口和类型 前面介绍了数组和Array类实现的接口.数组的大小是固定的 ...

  6. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  7. Envelope几何对象 Curve对象几何对象 Multipatch几何对象 Geometry集合接口 IGeometryCollection接口

    Envelope是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax, ...

  8. [知了堂学习笔记]_集合接口list与集合接口set的区别

    在Java中 除了 Map以外的集合的根接口都是Collection接口,而在Collection接口的子接口中,最重要的莫过于List和Set集合接口. 今天我们就来谈谈List集合接口与Set集合 ...

  9. JAVA集合接口及类

    各接口及类关系图 Iterable 所有集合的初始接口,实现该接口可进行foreach操作,只有一个iterator()方法,并返回iterator类型: Iterable在java.lang下,It ...

随机推荐

  1. perl的输出缓冲

      今天写一个小脚本的时候,需要即时输出当前进度到命令行上,并即时将重要数据写入报告文件中.但是perl默认是有输出缓冲的,显示到命令行上必须以\n结尾才行,输出到文件中,回车了都不行,非得要等缓冲区 ...

  2. absolute和relative的几个Demo

    这些例子最好通过FireFox结合FireBug调试查看 1.absolute让元素inline-block化 <!DOCTYPE html> <html xmlns="h ...

  3. Server.MapPath()目录详解

    最近在做相关的开发,碰到了Server.MapPath(),顺便来温习一下 Server.MapPath()获取网站的目录详解  ./当前目录 /网站主目录 ../上层目录 ~/网站虚拟目录 如果当前 ...

  4. 应付期间 Payables Periods

    (N) AP > Accounting > Control payables periods Click [Period Status] column to Open.

  5. Oracle Java SE远程安全漏洞(CVE-2013-5878)

    漏洞版本: Oracle Java SE 7u45 Oracle Java SE 6u65 漏洞描述: BUGTRAQ ID: 64927 CVE(CAN) ID: CVE-2013-5878 Jav ...

  6. Linux Kernel 整数溢出漏洞

    漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级:    漏洞类型: ...

  7. 修改UISearchBar的Cancel按钮为中文等本地化问题

    正确方法: 1:创建本地化strings. InfoPlist.strings 2:对InfoPlist.strings添加本地化语言. 即可. 只要添加文件, 系统会根据语言来调整显示文字 常见的搜 ...

  8. 【转】 Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...

  9. [codevs1557]热浪

    本题地址:http://www.luogu.org/problem/show?pid=1339 http://codevs.cn/problem/1557/ http://www.tyvj.cn/p/ ...

  10. 关于Spring的Controller及Struts的Action的多线程的注意

    struts是线程安全,并不是指多线程,而是指单态,当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象,execute方法加上了同步关键字,如果你在action里加上一个全 ...