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ć):