IList 是 ICollection 接口的子代,并且是所有非泛型列表的基接口。IList 实现有三种类别:只读、固定大小和可变大小。无法修改只读 IList。固定大小的 IList 不允许添加或移除元素,但允许修改现有元素。可变大小的 IList 允许添加、移除和修改元素。

ICollection 接口是 System.Collections 命名空间中类的基接口。ICollection 接口扩展 IEnumerable;IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。 IDictionary 实现是键/值对的集合,如 Hashtable 类。 IList 实现是值的集合,其成员可通过索引访问,如 ArrayList 类。  某些集合(如 Queue 类和 Stack 类)限制对其元素的访问,它们直接实现 ICollection 接口。  如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。定义所有非泛型集合的大小、枚举器和同步方法。

IQueryable 提供对未指定数据类型的特定数据源的查询进行计算的功能,IQueryable 接口由查询提供程序实现。 该接口只能由同时实现 IQueryable(Of T) 的提供程序实现。 如果该提供程序不实现 IQueryable(Of T),则无法对提供程序数据源使用标准查询运算符。 IQueryable 接口继承 IEnumerable 接口,以便在前者表示一个查询时可以枚举该查询的结果。 枚举强制执行与 IQueryable 对象关联的表达式树。 “执行表达式树”的定义是查询提供程序所特有的。 例如,它可能涉及将表达式树转换为适用于基础数据源的查询语言。 在调用 Execute 方法时将执行不返回可枚举结果的查询。

IEnumerable 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。

IEnumerator 是所有非泛型枚举数的基接口。有关此接口的泛形版本,请参见 IEnumerator(Of T)。C# 语言的 foreach 语句(在 Visual Basic 中为 for each)隐藏了枚举数的复杂性。 因此,建议使用 foreach,而不直接操作枚举数。枚举数可用于读取集合中的数据,但不能用于修改基础集合。最初,枚举数定位在集合中第一个元素前。 Reset 方法还会将枚举数返回到此位置。 在此位置,调用 Current 属性会引发异常。 因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。在调用 MoveNext 或 Reset 之前,Current 返回同一对象。 MoveNext 将 Current 设置为下一个元素。如果 MoveNext 越过集合的末尾,枚举数就会被放置在此集合中最后一个元素的后面,且 MoveNext 返回 false。 当枚举数位于此位置时,对 MoveNext的后续调用也返回 false。 如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。 若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。只要集合保持不变,枚举数就保持有效。 如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNext或 Reset 的调用将引发 InvalidOperationException。 如果在 MoveNext 和 Current 之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。 即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。 若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口。 在此示例中,没有显式调用这些接口的成员,但实现了它们,以便支持使用 foreach(在 Visual Basic 中为 for each)循环访问该集合。

using System;using System.Collections;

public class Person{public Person(string fName, string lName)    {this.firstName = fName;this.lastName = lName;    }

public string firstName;public string lastName;}

public class People : IEnumerable{private Person[] _people;public People(Person[] pArray)    {        _people = new Person[pArray.Length];

for (int i = 0; i < pArray.Length; i++)        {            _people[i] = pArray[i];        }    }

    IEnumerator IEnumerable.GetEnumerator()    {return (IEnumerator) GetEnumerator();    }

public PeopleEnum GetEnumerator()    {return new PeopleEnum(_people);    }}

public class PeopleEnum : IEnumerator{public Person[] _people;

// Enumerators are positioned before the first element// until the first MoveNext() call.    int position = -1;

public PeopleEnum(Person[] list)    {        _people = list;    }

public bool MoveNext()    {        position++;return (position < _people.Length);    }

public void Reset()    {        position = -1;    }

object IEnumerator.Current    {get        {return Current;        }    }

public Person Current    {get        {try            {return _people[position];            }catch (IndexOutOfRangeException)            {throw new InvalidOperationException();            }        }    }}

class App{static void Main()    {        Person[] peopleArray = new Person[3]        {new Person("John", "Smith"),new Person("Jim", "Johnson"),new Person("Sue", "Rabon"),        };

        People peopleList = new People(peopleArray);foreach (Person p in peopleList)            Console.WriteLine(p.firstName + " " + p.lastName);

    }}

详情请参见MSDN

转载于:https://www.cnblogs.com/smailxiaobai/archive/2011/12/29/2306492.html

IList,ICollection,IEnumerable,IEnumerator,IQueryable相关推荐

  1. C#知识点总结系列:2、C#中IDisposable和IEnumerable、IEnumerator

    C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存. A.首先需要让类实现IDisposable接口,然后实现IDispose方法. A.a核心Dis ...

  2. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

    1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 };IEnumerator myie = myArray.GetEnumerator();myie.Rese ...

  3. C# IEnumerable和IEnumerator的区别,如何实现

    IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别? 1. 简单来说IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的en ...

  4. EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心

    回到目录 对EF开发来说,导航属性肯定都用过,事实上,它是由VS IDE工具根据你的数据库关系结构自动生成的外键属性,在类视图中可以看到相关属性,它是以外键表名来标识的,如果是一对多的关系,那么,它会 ...

  5. 厚积薄发,丰富的公用类库积累,助你高效进行系统开发(10)---各种线程同步的集合类...

    俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力. 本篇的公用类库的介绍主题是程序开发中多线程操作环境中,常用到的线程安全的各类同 ...

  6. 厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)(转)

    自从上篇随笔<厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)> 一文以来,得到同行很多人的鼎力支持和关注,并且在大家的推动下,这篇文章也是上榜博客头条.编辑推荐.10天内推荐排行 ...

  7. 一、创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。

    一.创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新. 一个Asse ...

  8. C# 一些零零碎碎的方法,都是些帮助类,留存,也希望能帮助到各位

    ---------------------------------------------------------------------------------------------------- ...

  9. DotNetty系列六:将服务端和客户端改为Winform窗口,使用Redis做为缓存,实现用户登录,好友,群组上下线显示。

    这次改动挺大的. 1.服务端和客户端改为Winform窗口.好多细节未处理,只是实现了功能.     2.使用Redis做为缓存,版本redis-3.0.1,和RedisDesktopManager做 ...

最新文章

  1. 计算机网络的八股文自述(持续更新)
  2. 3-unit1 IPv6网络的管理
  3. python字典的增,删,改,查
  4. centos7查看当前系统时间、_CentOS7 设置系统时间
  5. php作菜单,PHP制作下拉透明菜单
  6. python天气预报的功能介绍_python实现智能语音天气预报
  7. 前端学习(2693):重读vue电商网站14之步骤条的使用与美化
  8. mysql简单常用语句汇总
  9. Socket编程--TCP/UDP
  10. 自动化运维--python_自动化-设计师的朋友还是敌人?
  11. Mac中无法运行旧版本印象笔记:版本太旧 你的本地印象笔记数据是由新版印象笔记管理
  12. mysql 中一个表里有父子关系_SQLAlchemy - 同一个表中的父子关系
  13. DPM目标检测算法(毕业论文节选)
  14. 群晖显示服务器错误代码21,群晖 DSM 6.2.3 升级 25426 错误 21 的解决办法 | 智享阁...
  15. 网上源码买卖靠谱吗?
  16. 疯子网页采集器之提取内容教程
  17. 乐行天下激光雷达数据口测试
  18. 几种部署工具比较foreman, ansible, fuel
  19. twitter无法获取推文_某些第三方Twitter客户端可能无法发送更长的推文
  20. [黑马程序员课程记录]C++基础部分2

热门文章

  1. 体系结构分析与设计语言AADL基础
  2. linux c 获取文件数量
  3. Linux 启动文件、设置环境变量的位置
  4. Mongoose源码分析之--简单的服务器搭建(C语言)
  5. awk '/#BEGIN/,/#END/{next}1' 1是什么意思?-转
  6. SQLite指南(0) 表和索引的文件存储结构
  7. android数字提示错误,从服务器接收数据时出现Android错误
  8. php 去除div标签,JavaScript_清除div下面的所有标签的方法,复制代码 代码如下: div id=s - phpStudy...
  9. Masterlab 1.1 发布,基于敏捷开发的项目管理工具
  10. 【CF453D】 Little Pony and Elements of Harmony(FWT)