当前位置:首页 > 电脑百科 > 电脑编程 > 手机访问:m.cnwxk.com

C#中的枚举器-电脑编程

来源:www.cnwxk.com时间:2017-07-26编辑:中国文学库最记录:手机版

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类。


文章: C#中的枚举器


  • 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)

    本月排行