C# Language
IEnumerable
Szukaj…
Wprowadzenie
IEnumerable
to interfejs podstawowy dla wszystkich nietypowych kolekcji, takich jak ArrayList, które można wyliczyć. IEnumerator<T>
to podstawowy interfejs wszystkich ogólnych enumeratorów, takich jak List <>.
IEnumerable
to interfejs, który implementuje metodę GetEnumerator
. GetEnumerator
zwraca IEnumerator
który zapewnia opcje iteracji w kolekcji, np. Foreach.
Uwagi
IEnumerable to interfejs podstawowy dla wszystkich nietypowych kolekcji, które można wyliczyć
IEnumerable
W swojej najbardziej podstawowej formie obiekt implementujący IEnumerable reprezentuje szereg obiektów. Przedmiotowe obiekty można iterować za pomocą słowa kluczowego foreach
c #.
W poniższym przykładzie obiekt sequenceOfNumbers
implementuje IEnumerable. Reprezentuje szereg liczb całkowitych. Pętla foreach
przechodzi kolejno przez każdą z nich.
int AddNumbers(IEnumerable<int> sequenceOfNumbers) {
int returnValue = 0;
foreach(int i in sequenceOfNumbers) {
returnValue += i;
}
return returnValue;
}
IEnumerable z niestandardowym modułem wyliczającym
Implementacja interfejsu IEnumerable umożliwia wyliczanie klas w taki sam sposób, jak w kolekcjach BCL. Wymaga to rozszerzenia klasy Enumerator, która śledzi stan wyliczenia.
Poza iteracją standardowej kolekcji, przykłady obejmują:
- Używanie zakresów liczb opartych na funkcji, a nie na kolekcji obiektów
- Implementowanie różnych algorytmów iteracji dla kolekcji, takich jak DFS lub BFS w kolekcji wykresów
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;
}
}
}