C# Language
IEnumerable
Поиск…
Вступление
IEnumerable
- это базовый интерфейс для всех не общих коллекций, таких как ArrayList, которые могут быть перечислены. IEnumerator<T>
- это базовый интерфейс для всех общих счетчиков, таких как List <>.
IEnumerable
- это интерфейс, реализующий метод GetEnumerator
. Метод GetEnumerator
возвращает IEnumerator
который предоставляет опции для итерации через коллекцию, например foreach.
замечания
IEnumerable - это базовый интерфейс для всех не общих коллекций, которые могут быть перечислены
IEnumerable
В своей основной форме объект, реализующий IEnumerable, представляет собой серию объектов. Объекты, о которых идет речь, могут быть повторены с использованием ключевого слова c # foreach
.
В приведенном ниже примере sequenceOfNumbers
объектовOfNumbers реализует IEnumerable. Он представляет собой серию целых чисел. Цикл foreach
выполняет итерацию по очереди.
int AddNumbers(IEnumerable<int> sequenceOfNumbers) {
int returnValue = 0;
foreach(int i in sequenceOfNumbers) {
returnValue += i;
}
return returnValue;
}
IEnumerable с пользовательским Enumerator
Реализация интерфейса 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;
}
}
}