一、集合类:

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. Microsoft Office 2010 requires 的 MSXML 版本 6.10.1129.0 be 已安装在您计算机的安装"的基于 Windows 7 的计算机上安装 Office 2010 时出现错误消息

    https://support.microsoft.com/zh-cn/kb/2290714

  2. OpenGl从零开始之坐标变换(上)

    坐标变换是深入理解三维世界的基础,非常重要.学习这部分首先要清楚几个概念:视点变换.模型变换.投影变换.视口变换. 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,因 ...

  3. 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)

    人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...

  4. Fedora 14 x64 试用手记

    欢迎大家给我投票: http://2010blog.51cto.com/350944 刊登在: http://os.51cto.com/art/201011/235506.htm FC14桌面使用体验 ...

  5. static_cast, dynamic_cast, const_cast探讨

    转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 ...

  6. 操作失败,没有该服务权限![ 机构号:99 ,用户ID:50000009 ,服务号:0101030112 ]

    操作失败,没有该服务权限![ 机构号:99 ,用户ID:50000009 ,服务号:0101030112 ] 此时我们可以把代码 SERVICE_NO 改成 10个0 即 0000000000 ,就可 ...

  7. USB枚举过程(2)

    用bus hound 得到的数据 GET MAX LUN 命令 详见USB_MSC_BlukOnly_v1.0 接下来用到的是UFI  SCSI

  8. hdu 1260 Tickets

    http://acm.hdu.edu.cn/showproblem.php?pid=1260 题目大意:n个人买票,每个人买票都花费时间,相邻的两个人可以一起买票以节约时间: 所以一个人可以自己买票也 ...

  9. 自己制作 SPx N合1 自动安装盘(x86)

    来处"xinso" 一.制作方法: 以技嘉和惠普为例作,其它的可以如法泡制及变通: 1.复制一份最常用的 OEM XP,例如技嘉,到D:\1TO2 2.在 D:\ 创造一个 HP ...

  10. HDU 5927 Auxiliary Set (dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5927 题意: 给你一棵树,其中有一些'不重要'的点,要是这些'不重要'的点的子树中有两个重要的点的LC ...