C#4.0图解教程 - 第20章 枚举数和迭代器


 

20.1 枚举数和可枚举类型

在.NET中获取一个对象枚举数的标准方法是调用对象的 GetEnumerator 方法。实现 GetEnumerator 方法的类型叫做可枚举类型(enumerable type或enumerable)。数组是可枚举类型。


 

20.2 使用 IEnumerator 接口

IEnumerator: 接口包含3个函数成员:Current、MoveNext、Reset。

Current: 返回序列中当前位置项的属性。

注意:它是只读属性。返回 object 类型引用,可返回任何类型。

MoveNext: 是把枚举位置前进到集合中的下一项的方法。返回布尔值,指示新的位置是有效位置或已经超过了序列的尾部。

注意:位置有效返回 ture。无效返回 false。枚举数的原始位置在序列中第一项之前。MoveNext 不许在第一次实用 Current 之前使用。

Reset: 方法把位置重置为原始状态。

显示行号 复制代码 这是一段程序代码。
  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             int[] arr ={10, 12, 11,3};
  6.             //foreach
  7.             foreach (var i in arr)
  8.             {
  9.                 Console.WriteLine(i);
  10.             }
  11.             //利用IEnumerator模仿foreach
  12.             IEnumerator Myarr = arr.GetEnumerator();
  13.             while (Myarr.MoveNext())
  14.             {
  15.                 int ie = (int)Myarr.Current;
  16.                 Console.WriteLine(ie);
  17.             }
  18.         }
  19.     }


 

20.3   IEnumerable 接口

IEnumerable接口只有一个成员——GetEnumerator方法,它返回对象的枚举数。

下图中ColorEnumerator实现了IEnumerator接口。

image

 

实用IEnumerable与IEnumerator的示例

旁白:看作20.6 IEnumerator<T> 接口的示例

显示行号 复制代码 这是一段程序代码。
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace Examples
  5. {
  6.     class ColorEnumerator : IEnumerator<string>
  7.     {
  8.         string[] Colors;
  9.         int Position = -1;
  10.         public string Current                          // Current--generic
  11.         {
  12.             get { return Colors[Position]; }
  13.         }
  14.         object IEnumerator.Current                     // Current--non-generic
  15.         {
  16.             get { return Colors[Position]; }
  17.         }
  18.         public bool MoveNext()                         // MoveNext
  19.         {
  20.             if (Position < Colors.Length - 1)
  21.             {
  22.                 Position++;
  23.                 return true;
  24.             }
  25.             else
  26.                 return false;
  27.         }
  28.         public void Reset()                            // Reset
  29.         {
  30.             Position = -1;
  31.         }
  32.         public void Dispose() { }
  33.         public ColorEnumerator(string[] colors)        // Constructor
  34.         {
  35.             Colors = new string[colors.Length];
  36.             for (int i = 0; i < colors.Length; i++)
  37.                 Colors[i] = colors[i];
  38.         }
  39.     }
  40.     class MyColors : IEnumerable
  41.     {
  42.         string[] Colors = { "Red", "Yellow", "Blue" };
  43.         public IEnumerator GetEnumerator()
  44.         {
  45.             return new ColorEnumerator(Colors);
  46.         }
  47.     }
  48.     class Program
  49.     {
  50.         static void Main()
  51.         {
  52.             MyColors mc = new MyColors();
  53.             foreach (string color in mc)
  54.                 Console.WriteLine(color);
  55.             Console.WriteLine("==============");
  56.             IEnumerator ie = mc.GetEnumerator();
  57.             while (ie.MoveNext())
  58.             {
  59.                 string i = (string)ie.Current;
  60.                 Console.WriteLine(i);
  61.             }
  62.             Console.WriteLine("==============");
  63.            
  64.         }
  65.     }
  66. }

 

image

 

20.6 IEnumerator<T> 接口

IEnumeranble<T> 接口从另外两个接口继承——非泛型 IEnumerator 接口和 IDisposable 接口。它肯定实现了它们的成员。

    IDisposable接口只有一个叫Dispose的类型为void的无参方法,用于释放类占据的非托管资源。

    IEnumerator<T>和IEnumerator都有一个叫做Current的成员,我们应该显示实现IEnumerator版本。

image


 

20.7 IEnumerable<T> 接口
由于类必须实现两个GetEnumerator方法,我们需要显示实现非泛型版本,并在类中实现泛型版本。

image


 

20.8  迭代器

下面迭代器返回一个泛型枚举数,该枚举数返回3个string类型的项。

yield renturn 语句声明知识枚举的下一项。

image

下面是方法另一个版本,输出同样的结果

image

yield 关键字向编译器指示它所在的方法是迭代器块。

yield 语句只能出现在 iterator(迭代器) 块中,这种块可作为方法、运算符或访问器的主体实现


 

20.9 常见迭代器模式

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值