C# 迭代器

2018-01-22 17:10 更新

 C# 迭代器

foreach 語句是枚舉器的消費者。

迭代器是枚舉器的生成器。

在這個例子中,我們使用迭代器返回一系列斐波納契數(shù):

using System;
using System.Collections.Generic;

class Main {
    static void Main() {
        foreach (int fib in Fibs(6)){
           Console.Write (fib + " ");
        }
    }
    static IEnumerable<int> Fibs (int fibCount) {
        for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
            yield return prevFib;
            int newFib = prevFib+curFib;
            prevFib = curFib;
            curFib = newFib;
        }
    }
}

yield return語句返回該枚舉器的下一個元素。


迭代器語義

迭代器是一個包含一個或多個 yield 語句的方法,屬性或索引器。

迭代器必須返回以下四個接口之一:

// Enumerable interfaces
System.Collections.IEnumerable
System.Collections.Generic.IEnumerable<T>

// Enumerator interfaces
System.Collections.IEnumerator
System.Collections.Generic.IEnumerator<T>

允許多個yield語句。 例如:

class Test {
   static void Main() {
      foreach (string s in Foo())
         Console.WriteLine(s); // Prints "One","Two","Three"
   }
   static IEnumerable<string> Foo() {
      yield return "One";
      yield return "Two";
      yield return "Three";
   }
}

yield break

yield break 語句指示迭代器塊應提早退出,而不返回更多元素。

以下代碼顯示了如何使用yield break:

static IEnumerable<string> Foo (bool breakEarly) {
   yield return "One";
   yield return "Two";
   if (breakEarly)
      yield break;

   yield return "Three";
}

返回語句在迭代器塊中是非法的,請使用yield break。

編寫序列

以下代碼顯示了如何僅輸出斐波納契數(shù)字:

using System;
using System.Collections.Generic;

class Main {
   static void Main() {
      foreach (int fib in EvenNumbersOnly (Fibs(6)))
          Console.WriteLine (fib);
   }
   static IEnumerable<int> Fibs (int fibCount) {
      for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
         yield return prevFib;
         int newFib = prevFib+curFib;
         prevFib = curFib;
         curFib = newFib;
      }
   }
   static IEnumerable<int> EvenNumbersOnly (IEnumerable<int> sequence) {
      foreach (int x in sequence)
         if ((x % 2) == 0)
            yield return x;
   }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號