Interfejsy IEnumerable i IEnumerator w języku C#

IEnumerable - wymóg pętli foreach.


Aby móc korzystać z pętli foreach musimy na naszej kolekcji zaimplementować interfejs IEnumerable. Interfejs IEnumerable ma tylko jedną metodę GetEnumerator(), która zwraca IEmunerator. Enumerator to mechanizm pozwalający na poruszanie się po kolekcji i zwracanie aktualnej pozycji w kolekcji.

Kod interfejsu IEnumerator:

public interface IEnumerator
{
    object Current { get; }
    bool MoveNext();
    void Reset();
}

Interfejs IEnumerator:

  • zawiera właściwość Current - pobiera aktualny element w kolekcji,
  • zamiera metodę MoveNext(), która przesuwa enumerator do kolejnego elementu kolekcji,
  • zawiera metodę Reset(), która ustawia enumerator na początek, który znajduje się przed pierwszym elementem kolekcji (kolekcja może być pusta, dlatego enumerator musi być ustawiony przed pierwszym elementem).
W przypadku gdy działamy na własnych, niestandardowych kolekcjach, musimy zaimplementować wszystkie elementy z interfejsu IEnumerator. Bez implementacji tego interfejsu nie będzie możliwe korzystanie z pętli foreach.

Kod przedstawiający zależność pomiędzy tymi interfejsami:

public class Program
{
    public static void Main()
    {
        IEnumerable<string> enumerable = new string[] { "A", "B", "C" };
 
        // Z użyciem foreach dostępnego w IEnumerable:
        foreach (string s in enumerable)
            Console.WriteLine(s);
 
        // Z użyciem Enumeratora:
        IEnumerator<string> enumerator = enumerable.GetEnumerator();
        while (enumerator.MoveNext())
        {
            string s = enumerator.Current;
            Console.WriteLine(s);
        }
    }
}
Interfejs IEnumerable pozwala w bardzo prosty sposób, za pomocą pętli foreach iterować po kolekcji, wykorzystując przy tym interfejs IEnumerable do obsługi tej pętli.

W przypadku interfejsu generycznego istnieje jedna różnica pomiędzy IEnumerator a IEnumerator<T>. IEnumerator posiada metodę Reset() natomiast IEnumerator<T> zawiera zarówno metodę Reset() jak i dziedziczy po interfejsie IDisposable, który zawiera metodę Dispose() służącą do zwalniania zasobów.
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):