一、集合类:

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. OpenERP 7.0 中文报表PDF乱码(WindowsXP)

    OpenERP默认安装输出的PDF中文报表都是一些方块: 此问题可以通过oecn_base_fonts模块解决: 更多关于oecn_base_fonts的信息请参考: 1. OpenERPv7.0 中 ...

  2. XposedNoRebootModuleSample 不需要频繁重启调试的Xposed 模块源码例子

    XposedNoRebootModuleSample(不需要频繁重启调试的Xposed 模块源码例子) Xposed Module Sample No Need To Reboot When Debu ...

  3. ansible条件使用--实践

    ansible条件使用 1.条件使用最简单的方式 ansible中使用条件最简单的方式如下所示: [root@ansibleserver kel]# cat conditions.yml --- - ...

  4. 配置spring管理的bean的作用域

    .singleton 在每一个spring Ioc容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init = "tru ...

  5. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

  6. bzoj3714: [PA2014]Kuglarz

    [PA2014]KuglarzTime Limit: 20 Sec Memory Limit: 128 MBSubmit: 553 Solved: 317[Submit][Status][Discus ...

  7. Codeforces Educational Codeforces Round 15 E - Analysis of Pathes in Functional Graph

    E. Analysis of Pathes in Functional Graph time limit per test 2 seconds memory limit per test 512 me ...

  8. 通用数据链接(UDL)的用法

    偶然看到UDL,决定看一下其用法. UDL:通用数据链接.此文件中提供 OleDbConnection 的连接信息.也就是说UDL只能在OleDbConnection中使用. 微软不建议使用UDL 因 ...

  9. ProxyFactory的一个问题

    今天写了一段很简单的代码,但一直都有问题.代码如下. 接口定义 using System; using System.Collections.Generic; using System.Linq; u ...

  10. Field 'SCHED_TIME' doesn't have a default value

    出现这个情况的原因是: 我jar包使用的是quartz-2.1.7版本,但是初始化集群的dbTables脚本用的却是2.2.1版本的,导致出现这个异常,改用2.1.7的dbTables脚本之后即解决问 ...