C#迭代器

时间:2023-03-10 03:40:26
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 = ; 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[] { , , , , , , , , , };
      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 = ; 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 = ; i < items.Length; i++)
      {  
        if ((Convert.ToInt32(items[i]) > ))
          yield break;         yield return items[i];
      }
    }     IEnumerator IEnumerable.GetEnumerator()
    {
      return GetEnumerator();
    }
  }

操作结果:

1
2
3
4
5