IEnumerable 接口

定义

公开枚举器,该枚举器支持对非泛型集合进行简单迭代。

public interface IEnumerable
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerable
派生
属性

示例

下面的代码示例演示了通过实现 IEnumerableIEnumerator 接口来循环访问自定义集合的最佳做法。 在此示例中,不会显式调用这些接口的成员,但它们实现为支持使用 foreach(Visual Basic 中的For Each)循环访问集合。 此示例是完整的控制台应用。 若要编译 Visual Basic 应用,请将 Startup 对象 更改为 项目 属性 页中的子主

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 包含返回 IEnumerator的单个方法 GetEnumeratorIEnumerator 通过公开 Current 属性和 MoveNextReset 方法来循环访问集合。

最佳做法是在集合类上实现 IEnumerableIEnumerator,以启用 visual Basic 语法中的 foreachFor Each),但不需要实现 IEnumerable。 如果集合未实现 IEnumerable,则仍必须遵循迭代器模式来支持此语法,方法是提供返回接口、类或结构的 GetEnumerator 方法。 使用 Visual Basic 时,必须提供 GetEnumerator返回的 IEnumerator 实现。 使用 C# 进行开发时,必须提供一个包含 Current 属性的类,以及 MoveNextReset 方法,如 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

另请参阅