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

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


IEnumerable Интерфейс

Определение

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

C#
public interface IEnumerable
C#
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
C#
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerable
Производный
Атрибуты

Примеры

В следующем примере кода демонстрируется рекомендация по итерации пользовательской коллекции путем реализации интерфейсов IEnumerable и IEnumerator. В этом примере члены этих интерфейсов не вызываются явным образом, но реализуются для поддержки использования foreach (For Each в Visual Basic) для итерации по коллекции. Этот пример является полным консольным приложением. Чтобы скомпилировать приложение Visual Basic, измените объект запуска на sub Main на странице свойств проекта.

C#
using System;
using System.Collections;

// Simple business object.
public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

// Collection of Person objects. This class
// implements IEnumerable so that it can be used
// with ForEach syntax.
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];

        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }

// Implementation for the GetEnumerator method.
    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }

    public PeopleEnum GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}

// When you implement IEnumerable, you must also implement IEnumerator.
public class PeopleEnum : IEnumerator
{
    public Person[] _people;

    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;

    public PeopleEnum(Person[] list)
    {
        _people = list;
    }

    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }

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

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

    public Person Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}

class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };

        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);
    }
}

/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */

Комментарии

IEnumerable — это базовый интерфейс для всех не универсальных коллекций, которые можно перечислить. Для универсальной версии этого интерфейса см. System.Collections.Generic.IEnumerable<T>. IEnumerable содержит один метод, GetEnumerator, который возвращает IEnumerator. IEnumerator предоставляет возможность итерации через коллекцию путем предоставления свойства Current и MoveNext и методов Reset.

Рекомендуется реализовать IEnumerable и IEnumerator в классах коллекции, чтобы включить синтаксис foreach (For Each в Visual Basic), однако реализация IEnumerable не требуется. Если коллекция не реализует IEnumerable, необходимо по-прежнему следовать шаблону итератора для поддержки этого синтаксиса, предоставляя метод GetEnumerator, который возвращает интерфейс, класс или структуру. При использовании Visual Basic необходимо предоставить реализацию IEnumerator, возвращаемую GetEnumerator. При разработке с помощью C# необходимо предоставить класс, содержащий свойство Current, а также методы MoveNext и Reset, как описано IEnumerator, но класс не должен реализовывать IEnumerator.

Методы

GetEnumerator()

Возвращает перечислитель, который выполняет итерацию по коллекции.

Методы расширения

Cast<TResult>(IEnumerable)

Приведение элементов IEnumerable к указанному типу.

OfType<TResult>(IEnumerable)

Фильтрует элементы IEnumerable на основе указанного типа.

AsParallel(IEnumerable)

Включает параллелизацию запроса.

AsQueryable(IEnumerable)

Преобразует IEnumerable в IQueryable.

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

Продукт Версии
.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 1.1, 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

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