文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C#2.0_5-迭代器

C#2.0_5-迭代器

时间:2011-04-08  来源:乱舞春秋

  1>=枚举数:

  枚举数是循环访问其关联集合的对象。它可被视作指向集合中任何元素的可移动的指针。一个枚举数只能与一个集合关联,但一个集合可以具有多个枚举数。C# foreach 语句使用枚举数并隐藏操作该枚举数的复杂性。枚举数可用于读取集合中的数据,但不能用于修改基础集合。

  集合要支持foreach则需要实现System.Collections.IEnumerable接口<公开枚举数,该枚举数支持在非泛型集合上进行简单迭代>【也可以不实现该接口】,该接口定义了一个方法GetEnumerator(),返回一个支持IEnumerator接口的对象,IEnumerator的成员如下:

名称 说明
bool MoveNex t方法 将枚举数推进到集合的下一个元素
void Rese t方法 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前
object Current 属性 获取集合中的当前元素
MyCollections
 1 public class MyCollections : IEnumerable
2 {
3 private string[] items;
4 MyCollections(string[] items)
5 {
6 this.items = items;
7 }
8 public IEnumerator GetEnumerator()
9 {
10 return new MyEnumerator(this);
11 }
12 public class MyEnumerator : IEnumerator
13 {
14 private int position = -1;
15 private MyCollections mc;
16 public MyEnumerator(MyCollections mc)
17 {
18 this.mc = mc;
19 }
20 public bool MoveNext()
21 {
22 if (position < this.mc.items.Length - 1)
23 {
24 position++;
25 return true;
26 }
27 else
28 {
29 return false;
30 }
31 }
32 public void Reset()
33 {
34 position = -1;
35 }
36 object IEnumerator.Current
37 {
38 get
39 {
40 return this.mc.items[position];
41 }
42 }
43 }
44 static void Main()
45 {
46 MyCollections f = new MyCollections(
47 new string[] { "乱舞春秋", "", "22" });
48 foreach (string item in f)
49 {
50 Console.WriteLine(item);
51 }
52 }
53 }

C#2.0以前,要使自己的集合支持foreach遍历,需要写上面一大坨代码<实现两个接口,也可不实现,但是必须给提供这两个接口中的同名方法>,C#2.0引入了yield return<返回每个元素>和yield break<终止迭代>:

改写上述代码:

New
    public IEnumerator GetEnumerator()
{
for (int i = 0; i < items.Length; i++)
{
yield return items[i];
}
}
//MyEnumerable方法全部删掉
只需实现一个接口IEnumerable就可以了<或者说有public IEnumerator GetEnumerator()此方法>;

像是匿名方法一样,编译器帮我们做了<这里编译器帮我们生成了"实现IEnumerator接口的一个类",通过查看IL代码>。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载