IEnumerable 接口
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
公开枚举器,该枚举器支持对非泛型集合进行简单迭代。
public interface class IEnumerablepublic 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 IEnumerabletype IEnumerable = interface[<System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")>]
type IEnumerable = interface[<System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type IEnumerable = interfacePublic Interface IEnumerable- 派生
- 属性
示例
下面的代码示例演示了通过实现 IEnumerable 和 IEnumerator 接口来循环访问自定义集合的最佳做法。 在此示例中,不会显式调用这些接口的成员,但它们实现为支持使用 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
 *
 */
Imports System.Collections
' Simple business object.
Public Class Person
    Public Sub New(ByVal fName As String, ByVal lName As String)
        Me.firstName = fName
        Me.lastName = lName
    End Sub
    Public firstName As String
    Public lastName As String
End Class
' Collection of Person objects, which implements IEnumerable so that
' it can be used with ForEach syntax.
Public Class People
    Implements IEnumerable
    Private _people() As Person
    Public Sub New(ByVal pArray() As Person)
        _people = New Person(pArray.Length - 1) {}
        Dim i As Integer
        For i = 0 To pArray.Length - 1
            _people(i) = pArray(i)
        Next i
    End Sub
    ' Implementation of GetEnumerator.
    Public Function GetEnumerator() As IEnumerator _
      Implements IEnumerable.GetEnumerator
        Return New PeopleEnum(_people)
    End Function
End Class
' When you implement IEnumerable, you must also implement IEnumerator.
Public Class PeopleEnum
    Implements IEnumerator
    Public _people() As Person
    ' Enumerators are positioned before the first element
    ' until the first MoveNext() call.
    Dim position As Integer = -1
    Public Sub New(ByVal list() As Person)
        _people = list
    End Sub
    Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
        position = position + 1
        Return (position < _people.Length)
    End Function
    Public Sub Reset() Implements IEnumerator.Reset
        position = -1
    End Sub
    Public ReadOnly Property Current() As Object Implements IEnumerator.Current
        Get
            Try
                Return _people(position)
            Catch ex As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
End Class
Class App
    Shared Sub Main()
        Dim peopleArray() As Person = { _
            New Person("John", "Smith"), _
            New Person("Jim", "Johnson"), _
            New Person("Sue", "Rabon")}
        Dim peopleList As New People(peopleArray)
        Dim p As Person
        For Each p In peopleList
            Console.WriteLine(p.firstName + " " + p.lastName)
        Next
    End Sub
End Class
' This code produces output similar to the following:
' 
' John Smith
' Jim Johnson
' Sue Rabon
注解
IEnumerable 是可以枚举的所有非泛型集合的基本接口。 有关此接口的通用版本,请参阅 System.Collections.Generic.IEnumerable<T>。 IEnumerable 包含返回 IEnumerator的单个方法 GetEnumerator。 IEnumerator 通过公开 Current 属性和 MoveNext 和 Reset 方法来循环访问集合。
最佳做法是在集合类上实现 IEnumerable 和 IEnumerator,以启用 visual Basic 语法中的 foreach(For Each),但不需要实现 IEnumerable。 如果集合未实现 IEnumerable,则仍必须遵循迭代器模式来支持此语法,方法是提供返回接口、类或结构的 GetEnumerator 方法。 使用 Visual Basic 时,必须提供 GetEnumerator返回的 IEnumerator 实现。 使用 C# 进行开发时,必须提供一个包含 Current 属性的类,以及 MoveNext 和 Reset 方法,如 IEnumerator所述,但类不必实现 IEnumerator。
方法
| GetEnumerator() | 返回循环访问集合的枚举器。 | 
扩展方法
| Cast<TResult>(IEnumerable) | 将 IEnumerable 的元素强制转换为指定类型。 | 
| OfType<TResult>(IEnumerable) | 根据指定类型筛选 IEnumerable 的元素。 | 
| AsParallel(IEnumerable) | 启用查询的并行化。 | 
| AsQueryable(IEnumerable) | 将 IEnumerable 转换为 IQueryable。 |