C#中的枚举器

Iterator:枚举器

如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的。这在C# 2.0中比 C# 1.1更容易实现一些。作为演示,我们先在 C# 1.1中为一个简单的集合添加枚举,然后我们修改这个范例,使用新的C#2.0 枚举构建方法。

我们将以创建一个简单化的List Box作为开始,它将包含一个8字符串的数组和一个整型,这个整型用于记录数组中已经添加了多少字符串。构造函数将对数组进行初始化并使用传递进来的参数填充它。

public ListBox(params string[] initialStrings)
 {
 strings = new String[8];
 foreach (string s in initialStrings)
 {
 strings[ctr++] = s;
 }
 }

除此以外,ListBox类还需要一个Add方法(进行添加 string 的操作) 和 一个返回数组中字符串个数的方法。

public void Add(string theString)
 {
 strings[ctr] = theString;
 ctr++;
 }
public int GetNumEntries()
 {
 return ctr;
 }

NOTE:实际开发中,通常使用ArrayList,而不是固定大小的数组。在这里为了程序简单就没有做数组下标越界的检测。

从感觉上看,ListBox像是一个集合,如果可以使用集合中通常使用的 foreach 循环来获取listBox中的所有字符串将会是非常便利的。如此的话,可以这样书写代码:

ListBox lb = new ListBox("a", "b", "c", "d", "e", "f", "g", "h");
foreach (string s in lb) {
 Console.WriteLine(s);
 }

但是,会得到这样一个错误:

“Iterator.ListBox”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“Iterator.ListBox”类型的变量

想要使用foreach语句,还必须实现IEnumerable 接口。

这个接口只要求实现一个方法: GetEnumerator。这个方法必须返回一个实现了IEnumerator 接口的对象。除此以外,我们需要返回的这个对象不仅实现了IEnumerator,而且知道如何枚举ListBox对象。你将需要创建一个 ListBoxEmunerator(在下面描述):

NOTE: IEnumerable 和 IEnumerator 是不同的接口,请不要搞混了。

public IEnumerator GetEnumerator()
 {
 return new ListBoxEnumerator();
 }

现在,ListBox 可以使用 foreach 循环了:

ListBox lbt = new ListBox("Hello", "World");
lbt.Add("Who");
lbt.Add("Is");
lbt.Add("John");
lbt.Add("Galt");
foreach (string s in lbt)
 {
 Console.WriteLine("Value: {0}", s);
 }

先是实例化这个ListBox ,并初始了两个字符串,随后又添加了四个。foreach循环接受ListBox实例,并且迭代它,依次返回字符串。输出是:

Hello
World
Who
Is
John
Galt

实现 IEnumerator 接口

注意到ListBoxEnumerator不仅需要实现IEnumerator接口,对于ListBox类它也需要一些特别了解;特别是,它必须可以获得ListBox的字符串数组并且遍历其所包含的字符串。IEnumerable 类和与其相关的 IEnumerator类之间的关系有一点微妙。实现IEnumerator接口的最好办法是在IEnumerable类里创建一个嵌套的IEnumerator类。

public class ListBox : IEnumerable
 {
 // 嵌套的私有ListBoxEnumerator类实现
 private class ListBoxEnumerator : IEnumerator
 {
 // 代码实现...
 }
 // ListBox类的代码...
 }

注意ListBoxEnumerator需要对它所嵌入的ListBox类的一个引用。你可以通过ListBoxEnumerator的构造函数来传递。

时间: 2025-01-01 03:29:59

C#中的枚举器的相关文章

枚举器模式(Enumerator pattern)

如何使用枚举器模式(Enumerator pattern): 1.  如果你要实现IEnumerable.GetEnumerator,你也要实现一个GetEnumerator方法的非虚方法版本.你的枚举器类的IEnumerable.GetEnumerator方法应该调用这个非虚方法.如下所示应该返回一个内嵌的枚举器结构: ·                           class MyClass : IEnumerable ·                           { · 

再论枚举器

我们现在可以开始演示Enumeration(枚举)的真正威力:将穿越一个序列的操作与那个序列的基础结构分隔开.在下面的例子里,PrintData类用一个Enumeration在一个序列中移动,并为每个对象都调用toString()方法.此时创建了两个不同类型的集合:一个Vector和一个Hashtable.并且在它们里面分别填充Mouse和Hamster对象(本章早些时候已定义了这些类:注意必须先编译HamsterMaze.java和WorksAnyway.java,否则下面的程序不能编译).由

java的枚举器(反复器)

在任何集合类中,必须通过某种方法在其中置入对象,再用另一种方法从中取得对象.毕竟,容纳各种各样的对象正是集合的首要任务.在Vector中,addElement()便是我们插入对象采用的方法,而elementAt()是提取对象的唯一方法.Vector非常灵活,我们可在任何时候选择任何东西,并可使用不同的索引选择多个元素. 若从更高的角度看这个问题,就会发现它的一个缺陷:需要事先知道集合的准确类型,否则无法使用.乍看来,这一点似乎没什么关系.但假若最开始决定使用Vector,后来在程序中又决定(考虑

如何使用系统设备枚举器

系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法.而且它能够区分不同的硬件设备,即便是同一个Filter支持它们.这对那些使用Windows驱动模型和KSProxy Filter的设备来说是非常有用的.系统设备枚举器对它们按不同的设备实例进行对待(译注:虽然它们支持相同Filter). 当我们利用系统设备枚举器查询设备的时候,系统设备枚举器为特定类型的设备(如,音频捕获和视频压缩)生成了一张枚举表(Enumerator).类型枚举器(Category enumerato

PropertyGrid中的枚举显示为中文(转)

本文转载:http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html   ropertyGrid中的枚举显示为中文 在系统开发中,经常会使用PropertyGrid来修改或者展示某个对象的属性,如果类中定义了枚举,在展现的时候默认会展示枚举的项或者枚举值,但是这并不是我们想要的.用户使用的时候并不清楚该项代表的意思.之前介绍过枚举显示中文的一篇文章,大家可以看下,枚举显示中文. 想要的效果: 在PropertyGrid中枚举显示中,又比

Jsdk5.0中新增枚举enum类型使用例解

js 作者:Junsan Jin 日期:2005-03-25 邮箱:junsan21@126.com ; junnef21@sohu.com Jsdk5.0中新增了很多的特性,如泛型.增强的循环.改进的装.拆箱.静态引入等,大大增强了java语言的易用性. 我现在正在做一个从com+(dcom)平台到j2ee平台移植的项目,中间有很多枚举类型的定义,以前做起来要引入第三方类库,或者自己写类库,或者干脆定义成静态变量使用,很不方便,而且可能会产生很多问题.Jsdk5.0的发布正好解决了这些问题.

在网页中插入播放器的代码

插入|网页 在页面中插入播放器插入Windows Media Player: ID:6BF52A52-394A-11d3-B153-00C04F79FAA6 插入real:<object id="RAOCX" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA\> ----------例子--------------- <object id="MediaPlayer" height=&q

ASP.NET中绑定枚举类型

asp.net 在项目开发中好多地方用了枚举,要把枚举显示到下拉列表框中我们平常的方法就是在下拉列表控件中一个一个添加进去!这样做也行但如果我的枚举类型中的枚举值一旦改变,那么你就得满世界的去找然后再修改很麻烦. 这里我有反射动态的绑定枚举值就可以很方便的做修改了,代码如下: public enum Eume{ 星期一, 星期二, 星期三, 星期四, 星期五} 绑定方法: private void BinderDays(){ Type type = typeof(Eume); FieldInfo

JavaScript中的枚举

在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留).然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式--JSON来实现它. 如下,我们来定义Week的枚举: if(typeof WeekDay == "undefined"){ var WeekDay = {}; WeekDay.Sunday = 0; WeekDay.Monday = 1; WeekDay.Tuesday = 2; Week