zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    软件测试跟踪工具Bugzilla的安装
    Linux必备命令
    BPM Activiti5 学习资料
    23种Java设计模式-传智播客课程
    linux svn 启动 关闭
    JQuery调用iframe子页面函数/对象的方法
    判断 iframe 是否加载完成的完美方法
    java获得数据库信息常用API(DatabaseMetaData)示例
    JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
    旧金山大学的算法可视化学习教程 赞的教程,将抽象的算法可视化,易于理解
  • 原文地址:https://www.cnblogs.com/tangge/p/2881119.html
Copyright © 2011-2022 走看看