IEnumerable

IEnumerable 列挙可能な ArrayList などのすべての非ジェネリック コレクションの基本インターフェイスです。 IEnumerator<T> List<>.

などのすべての汎用列挙子の基本インターフェイスです。

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

# カスタム列挙子を使用した 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;
        }
    }
}

# 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 は、列挙可能なすべての非ジェネリック コレクションの基本インターフェイスです