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
衍生
屬性

範例

下列程式代碼範例示範藉由實作 IEnumerableIEnumerator 介面來逐一查看自定義集合的最佳做法。 在此範例中,不會明確呼叫這些介面的成員,但會實作這些介面,以支援在Visual Basic中使用 foreachFor Each)逐一查看集合。 此範例是完整的控制台應用程式。 若要編譯 Visual Basic 應用程式,請將 Startup 物件 變更為專案 [屬性] 頁面中的 [子主要]

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,它會傳回 IEnumeratorIEnumerator 藉由公開 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

另請參閱