サーチ…


前書き

IEnumerableは、列挙できるArrayListのような非ジェネリックコレクションの基本インターフェイスです。 IEnumerator<T>はList <>のようなすべての汎用列挙子の基本インターフェイスです。

IEnumerableは、メソッドGetEnumeratorを実装するインターフェイスGetEnumeratorGetEnumeratorメソッドは、foreachのようなコレクションを反復処理するオプションを提供するIEnumeratorを返します。

備考

IEnumerableは、列挙できるすべての非ジェネリックコレクションの基本インターフェイスです。

IEnumerable

最も基本的な形式では、IEnumerableを実装するオブジェクトは一連のオブジェクトを表します。問題のオブジェクトは、c# foreachキーワードを使用して反復することができます。

以下の例では、オブジェクトsequenceOfNumbersはIEnumerableを実装しています。一連の整数を表します。 foreachループは、それぞれを順番に繰り返します。

int AddNumbers(IEnumerable<int> sequenceOfNumbers) {
    int returnValue = 0;
    foreach(int i in sequenceOfNumbers) {
        returnValue += i;
    }
    return returnValue;
}

カスタム列挙子でIEnumerable

IEnumerableインターフェイスを実装すると、BCLコレクションと同じ方法でクラスを列挙できます。これには、列挙の状態を追跡するEnumeratorクラスを拡張する必要があります。

標準的なコレクションを反復する以外にも、次のような例があります。

  • オブジェクトの集合ではなく関数に基づく数値の範囲を使う
  • グラフコレクションのDFSやBFSなど、コレクションに異なる反復アルゴリズムを実装する
public static void Main(string[] args) {

    foreach (var coffee in new CoffeeCollection()) {
        Console.WriteLine(coffee);
    }
}

public class CoffeeCollection : IEnumerable {
    private CoffeeEnumerator enumerator;

    public CoffeeCollection() {
        enumerator = new CoffeeEnumerator();
    }

    public IEnumerator GetEnumerator() {
        return enumerator;
    }

    public class CoffeeEnumerator : IEnumerator {
        string[] beverages = new string[3] { "espresso", "macchiato", "latte" };
        int currentIndex = -1;

        public object Current {
            get {
                return beverages[currentIndex];
            }
        }

        public bool MoveNext() {
            currentIndex++;

            if (currentIndex < beverages.Length) {
                return true;
            }

            return false;
        }

        public void Reset() {
            currentIndex = 0;
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow