Прочитать на английском

Поделиться через


IEnumerator<T> Интерфейс

Определение

Поддерживает простую итерацию по универсальной коллекции.

C#
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
C#
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator

Параметры типа

T

Тип объектов для перечисления.

Это ковариантный параметр типа. Это означает, что вы можете использовать любой из указанных типов или любой тип, являющийся более производным. Дополнительные сведения о ковариантности и контрвариантности см. в статье Ковариантность и контрвариантность в универсальных шаблонах.
Производный
Реализации

Примеры

В следующем примере показана реализация интерфейса IEnumerator<T> для класса коллекции пользовательских объектов. Пользовательский объект — это экземпляр типа Box, а класс коллекции — BoxCollection. Этот пример кода является частью более крупного примера, предоставленного для интерфейса ICollection<T>.

C#

// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
    private BoxCollection _collection;
    private int curIndex;
    private Box curBox;

    public BoxEnumerator(BoxCollection collection)
    {
        _collection = collection;
        curIndex = -1;
        curBox = default(Box);
    }

    public bool MoveNext()
    {
        //Avoids going beyond the end of the collection.
        if (++curIndex >= _collection.Count)
        {
            return false;
        }
        else
        {
            // Set current box to next item in collection.
            curBox = _collection[curIndex];
        }
        return true;
    }

    public void Reset() { curIndex = -1; }

    void IDisposable.Dispose() { }

    public Box Current
    {
        get { return curBox; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }
}

Комментарии

IEnumerator<T> является базовым интерфейсом для всех универсальных перечислителей.

Оператор foreach языка C# (for each в C++, For Each в Visual Basic) скрывает сложность перечислителей. Поэтому рекомендуется использовать foreach вместо непосредственного управления перечислителем.

Перечислители можно использовать для чтения данных в коллекции, но их нельзя использовать для изменения базовой коллекции.

Изначально перечислитель размещается перед первым элементом в коллекции. На этой позиции Current не определен. Поэтому необходимо вызвать MoveNext, чтобы перейти перечислителя к первому элементу коллекции перед чтением значения Current.

Current возвращает тот же объект до вызова MoveNext. MoveNext задает Current следующему элементу.

Если MoveNext передает конец коллекции, перечислитель размещается после последнего элемента в коллекции и MoveNext возвращает false. Если перечислитель находится в этой позиции, последующие вызовы MoveNext также возвращают false. Если последний вызов MoveNext возвращен false, Current не определен. Невозможно снова задать Current для первого элемента коллекции; Вместо этого необходимо создать новый экземпляр перечислителя.

Метод Reset предоставляется для взаимодействия COM. Он не обязательно должен быть реализован; Вместо этого средство реализации может просто создать NotSupportedException. Тем не менее, если вы решили сделать это, необходимо убедиться, что вызывающие пользователи не полагаются на Reset функциональные возможности.

Если изменения вносятся в коллекцию, например добавление, изменение или удаление элементов, поведение перечислителя не определено.

Перечислитель не имеет монопольного доступа к коллекции; Таким образом, перечисление через коллекцию по сути не является потокобезопасной процедурой. Чтобы гарантировать безопасность потоков во время перечисления, можно заблокировать коллекцию во время всего перечисления. Чтобы разрешить доступ к коллекции несколькими потоками для чтения и записи, необходимо реализовать собственную синхронизацию.

Реализации коллекций по умолчанию в пространстве имен System.Collections.Generic не синхронизируются.

Примечания для тех, кто реализует этот метод

Для реализации этого интерфейса требуется реализация негенерического IEnumerator интерфейса. Методы MoveNext() и Reset() не зависят от Tи отображаются только в негенерическом интерфейсе. Свойство Current отображается в обоих интерфейсах и имеет разные типы возвращаемых значений. Реализуйте негенерическое свойство Current как явную реализацию интерфейса. Это позволяет любому потребителю негенерного интерфейса использовать универсальный интерфейс.

Кроме того, IEnumerator<T> реализует IDisposable, что требует реализации метода Dispose(). Это позволяет закрыть подключения к базе данных или освободить дескрипторы файлов или аналогичные операции при использовании других ресурсов. Если нет дополнительных ресурсов для удаления, укажите пустую реализацию Dispose().

Свойства

Current

Возвращает элемент в коллекции в текущей позиции перечислителя.

Методы

Dispose()

Выполняет определяемые приложением задачи, связанные с освобождением, освобождением или сбросом неуправляемых ресурсов.

(Унаследовано от IDisposable)
MoveNext()

Перемещает перечислитель к следующему элементу коллекции.

(Унаследовано от IEnumerator)
Reset()

Задает перечислителю начальную позицию, которая перед первым элементом в коллекции.

(Унаследовано от IEnumerator)

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел