Это не очень часто, но аналогия IEnumerator<T>
интерфейс:
var enumerator = labels.GetEnumerator();
.NET-х IEnumerator
отличается от Java-х Iterator
со следующим:
Iterator
после строительства указывает на первый элемент коллекции (или для пустой коллекции недействителен, и hasNext
немедленно вернет false
), IEnumerator
баллов изначально перед тем первый элемент коллекции (для пустой коллекции MoveNext
вернется false
)
Iterator
имеет hasNext
метод, в то время как для IEnumerator
вы проверить результат MoveNext
метода
Iterator
имеет next
метод, в то время как для IEnumerator
вы также использовать MoveNext
Iterator
«S next
возвращает следующий элемент, в то время как с IEnumerator
вы используете Current
свойство после вызова MoveNext
Iterator
в Java имеет метод remove
, который позволяет удалять элементы из базовой коллекции. Там нет аналога в IEnumerator
Так что для Java вы итерацию с чем-то вроде этого:
it = labels.iterator();
while (it.hasNext())
{
elem = it.next();
}
В то время как в C#:
en = labels.GetEnumerator();
while (en.MoveNext())
{
elem = en.Current;
}
Обычно, имея labels
как коллекция (который всегда реализует IEnumerable<T>
), вы просто используете его напрямую:
foreach (var label in labels)
{
//...
}
И, конечно же, вы можете хранить IEnumerable<T>
для последующего использования (имена, относящиеся к вашему примеру):
IEnumerable<Label> it = labels;
Берегись, что IEnumerable<T>
ленив, так же, как Iterator
в Java.
Вы также можете легко получить снимок коллекции, как это (опять же, it
относится к вашему примеру, лучше имя может быть выбрано):
IEnumerable<Label> it = labels.ToArray();
// or Label[] it = labels.ToArray();
// or better: var it = labels.ToArray();