zoukankan      html  css  js  c++  java
  • C#迭代器

    迭代器概述

    迭代器是可以返回相同类型的值的有序序列的一段代码。

    迭代器可用作方法、运算符或 get 访问器的代码体。

    迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。有关更多信息,请参见 yield。

    可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,

    迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

    迭代器是使用在foreach中的集合。在C#2.0中使用迭代器创建一个用于foreach的集合,实现上比较简单:继承于IEumnerable,并实现GetEnumerator()。

    首先这个集合要基于IEnumerable(可以使用泛型),下面先来实现一个非泛型版的迭代器。代码如下:

         public class DaysOfTheWeek : System.Collections.IEnumerable
       {
         
    string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };      public System.Collections.IEnumerator GetEnumerator()      {        for (int i = 0; i < m_Days.Length; i++)        {          yield return m_Days[i];        }      }    }
       
    class TestDaysOfTheWeek    {      static void Main()      {        DaysOfTheWeek week = new DaysOfTheWeek();        foreach (string day in week)        {          System.Console.Write(day + " ");        }        Console.Read();      }   }

    操作结果是:

    Sun Mon Tue Wed Thr Fri Sat

    其中yied return关键字产生枚举元素

    泛型版迭代器的实现代码如下:

           static void Main(string[] args)
        { 
          Stack<int> stack = new Stack<int>();
          stack.items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
          foreach (int i in stack)
          {
            Console.WriteLine(i);
          }
          Console.Read();
       }
    public class Stack<T> : IEnumerable<T>   {
        
    public T[] items;     public IEnumerator<T> GetEnumerator()     {       for (int i = 0; i < items.Length; i++)       {         yield return items[i];       }     }
        IEnumerator IEnumerable.GetEnumerator()     {
          
    return GetEnumerator();     } }

    运行结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    在自定义迭代器时,我们可以利用yield break关键字跳出循环。如上面的例子中,我们想只输出小于等于5的项,调整上面代码,如:

        public class Stack<T> : IEnumerable<T>
      {
        
    public T[] items;     public IEnumerator<T> GetEnumerator()     {       for (int i = 0; i < items.Length; i++)       {           if ((Convert.ToInt32(items[i]) > 5))           yield break;         yield return items[i];       }     }     IEnumerator IEnumerable.GetEnumerator()     {       return GetEnumerator();     }   }

    操作结果:

    1
    2
    3
    4

  • 相关阅读:
    Django 之DRF删改查的API接口
    Django 之DRF原理操作
    通过密码、username、时间戳进行md5加密简单脚本
    Java 之GC常用命令
    ORM 之常用查询、字段类型、约束
    ORM 之单表查询案例
    Django session使用
    K8S 之yaml文件参数介绍1
    K8S 之使用Capabilities与限制网络带宽
    K8S 之容器生命周期钩子
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/5513959.html
Copyright © 2011-2022 走看看