一、集合类:

1.1 ICollection接口

  前面我们学习了数组,这是.net Framework定义的最基本的集合类型,除过数组外,.net Framework还另外定义了很多集合类型以满足编程的需要。

常见的集合有:

  • 向量;
  • 链表;
  • 双端队列;
  • 栈;
  • 树;
  • Hash表;
  • Hash映射。

  所有的这些集合类型,在.net Framework中都必须实现一个重要的接口:ICollection接口。ICollection接口为实现它的类定义了两个主要规范:

  • 集合元素数量(表现为Count属性);
  • 访问集合的迭代子(表现为GetEnumerator方法)。

  其中,GetEnumerator方法是由ICollection的父接口IEnumerable接口继承得来的。

  ICollection接口定义了一个存储和获取object类型对象引用的集合,所以可以存储和获取各种引用类型对象的引用或值类型对象。

1.2 IEnumerable接口

  IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力。

  IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。

图1 ICollection继承层次

二、迭代子

  迭代子在C++中也称为迭代器,是设计模式中的迭代模式,其存在的意义为:每一种集合都具备不同的存储形式,例如向量使用数组来存储,链表使用对象和对象间的引用来存储,表采用多维数组或十字引用来保存数据,树通过对象和对象间的多个引用来建立关系,图采用树或表来保存其关系……可见不同的集合类存储数据的方式是多样化的。存储的多样性必然导致访问的多样性,集合最常用的访问是“遍历”,即从集合的头部访问到集合的尾部,我们需要想办法使用一种统一的方式遍历访问不同形式的集合。这就是迭代方式产生的基本原因。

  迭代模式将集合类看做一个容量无限的容器,并且容器的存放规则是线性的,即容器里的每一个元素都必须具有一个直接前趋(除过第一个元素)和一个直接后继(除过最后一个元素)容器中具备一个标志,可以指向容器中的任意一个存储单位

  迭代分为两种:单向只向前迭代和双向迭代

2.1 单向只向前迭代模式

  对于单向只向前迭代模式,集合的单元标志只能从集合的某个元素起始逐一向后移动,所以最基本的迭代模式定义了三种操作:

  • 访问标志所在项;
  • 标志前进到下一项并判断是否到达集合末尾;
  • 重新回到初始项。

图2 单向只向前迭代

2.2 双向迭代模式

  对于双向迭代模式,集合的单元标志即从集合的某个元素起逐一向后移动,也可以从集合的某一个元素起逐一向前移动,所以该类型迭代器定义了四种操作:

  • 访问标志所在当前项;
  • 标志前进到下一项并判断标志是否到达集合末尾;
  • 标志回到前一项并判断标志是否到达集合起始;
  • 回到初始项。

图3 双向迭代

  .net Framework使用IEnumerator接口定义了一个单向只向前迭代规范。

  ICollection接口继承了IEnumerable接口,该接口定义的GetEnumerator方法可以获取到一个当前集合类对象的迭代子对象,即一个实现了IEnumerator接口的对象。

  凡是实现了IEnumerable接口的类,都可以使用foreach循环迭代遍历。

  IEnumerator接口定义了一个可以遍历object类型对象引用的迭代子,IEnumerable接口定义了获取这种迭代子对象的方法。

三、泛型集合

3.1 ICollection<T>接口

  ICollection<T>接口定义了泛型集合接口,所谓泛型集合,即使用了.net Framework提供的泛型特性,使集合限定为只存储一种特定类型对象引用或值类型的数据的集合。泛型集合增强了集合访问的效率和安全性。

  由于存储类型已被确定,所以ICollection<T>比ICollection接口提供了更多的方法,包括添加到集合,从集合删除以及判断一个对象引用(或对象值)是否在集合中存在。

3.2 IEnumerable<T>接口

  ICollection<T>接口实现了IEnumerable<T>接口,主要用来返回一个实现了实现了IEnumerator<T>接口的,确定类型的迭代子对象

  参考ICollection<T>的继承关系图。

图4 ICollection<T>接口继承关系图

  熟悉上述的系列接口,这是我们后面学习各种集合类对象的基础。

C#中的ICollection接口的更多相关文章

  1. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

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

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

  3. C#中对IDisposable接口的理解

    http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html C#中对IDisposable接口的理解 本人最近接触一个项目,在这个项目里面看到很多类实现了 ...

  4. Java中的内部接口

    什么是内部接口 内部接口也称为嵌套接口,即在一个接口内部定义另一个接口.举个例子,Entry接口定义在Map接口里面,如下代码: public interface Map { interface En ...

  5. C#中抽象类和接口

    下面是我做的测试: using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  6. ODI中的临时接口

    在ODI 11g及后续的版本中,针对复杂的ETL处理,可分解为多个步骤,在中间步骤中使用临时接口,而不用建立相应的物理表,ODI会在处理过程中自动创建和删除这些中间表,从而降低ETL处理复杂度:同时, ...

  7. java 子接口中定义与父接口相同的方法

    今天碰到一个很有意思的问题,在java中如果子接口中定义了与父接口中已经有的方法会发生什么事情呢?比如: interface IRunnable extends Runnable{ void run( ...

  8. 如何通过图片在 HTTPS 网站中获取 HTTP 接口数据

    <script> (function() { var Decode=function(b){var e;e=[];var a=b.width,c=b.height,d=document.c ...

  9. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

随机推荐

  1. 计算器显示e-005什么意思

    计算器显示e-005什么意思 1e-005是科学表达式,即 =1e-5 =0.00001e+005就是乘以10的5次方 就是-1.4989*10^5 这是科学计数法(也叫指数计数法)   这是科学计数 ...

  2. nmon基础

    nmon是分析 AIX 和 Linux 性能的免费工具 最简单的安装方式(Ubuntu apt源) sudo apt-get install nmon 在terminal下打开nmon 敲CMD,出现 ...

  3. Yii笔记---redirect重定向

    Yii的redirect方法在CControler与CHttpRequest之中都有被定义,CController中的redirect调用了CHttpRequest中的redirect方法.我们平常调 ...

  4. ansible中文手册-基础模块使用

    此篇文章主要是翻译ansible官网文档而来,在里面讲述了如何使用ansible的基础模块,总体感觉比较晦涩,但是后面会写出自己相关实践的文档,从而更加通俗易懂,官网的东西拿来当手册偶尔翻翻也是很不错 ...

  5. IIS启动出错解决方法

    IIS出现server application error,最终解决办法2007年10月30日 星期二 20:38Server Application Error The server has enc ...

  6. Strider 持续集成(gitlab)

    Strider安装后运行: Mac: strider Ubuntu: bin/strider 本地运行时浏览器访问: http://127.0.0.1:3000 其他服务器:服务器地址 + 端口号(3 ...

  7. 从一个简单的Java单例示例谈谈并发

    一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...

  8. 2013 ACM/ICPC南京邀请赛B题(求割点扩展)

    题目链接:http://icpc.njust.edu.cn/Contest/194/Problem/B B - TWO NODES 时间限制: 10000 MS 内存限制: 65535 KB 问题描述 ...

  9. Python基础 字符串的魔法

    capitalize(self) 返回值:将字符串的第一个首字母变成大写,其他字母变小写 s = 'hello World' ss = s.capitalize() print(ss) Hello w ...

  10. HDU1963Investment(DP)

    简单DP,题解见代码