本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

IEnumerable 接口

 

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

若要浏览此类型的.NET Framework 源代码,请参阅Reference Source

命名空间:   System.Collections
程序集:  mscorlib(位于 mscorlib.dll)

[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[ComVisibleAttribute(true)]
public interface IEnumerable

名称说明
System_CAPS_pubmethodGetEnumerator()

返回循环访问集合的枚举数。

名称说明
System_CAPS_pubmethodAsParallel()

已重载。启用查询的并行化。(由 ParallelEnumerable 定义。)

System_CAPS_pubmethodAsQueryable()

已重载。将转换 IEnumerableIQueryable(由 Queryable 定义。)

System_CAPS_pubmethodCast<TResult>()

将强制转换的元素 IEnumerable 为指定的类型。(由 Enumerable 定义。)

System_CAPS_pubmethodOfType<TResult>()

筛选的元素 IEnumerable 根据指定的类型。(由 Enumerable 定义。)

System_CAPS_note说明

若要查看此类型的.NET Framework 源代码,请参阅Reference Source 你可以浏览源代码联机,请下载离线查看的引用并在调试; 过程中逐步执行源 (包括修补程序和更新)see instructions.

IEnumerable是可以枚举的所有非泛型集合的基接口。 有关此接口的泛型版本,请参阅System.Collections.Generic.IEnumerable<T> IEnumerable包含单个方法GetEnumerator,它将返回IEnumerator IEnumerator提供了通过公开循环访问集合的能力Current属性和MoveNextReset方法。

若要实现最佳做法是IEnumerableIEnumerator上您的集合类,以启用foreach(For Each在 Visual Basic 中) 语法,但是实现IEnumerable不是必需的。 如果你的集合不实现IEnumerable,您仍必须按照要通过提供支持此语法的迭代器模式GetEnumerator返回接口、 类或结构的方法。 如果使用 Visual Basic,则必须提供IEnumerator实现,它可以返回GetEnumerator 使用 C# 开发时必须提供一个包含类Current属性,和MoveNextReset方法如下所述IEnumerator,但类不必实现IEnumerator

下面的代码示例演示如何循环通过实现自定义集合的最佳做法IEnumerableIEnumerator接口。 在此示例中,不显式调用这些接口的成员,但它们并实现以支持使用foreach(For Each在 Visual Basic 中) 以循环访问集合。 此示例是一个完整的控制台应用。 若要编译 Visual Basic 应用程序,更改启动对象Sub Main在项目的属性页。

有关示例,演示如何实现IEnumerable接口,请参阅Implementing the IEnumerable Interface in a Collection Class

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
 *
 */

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用
返回页首
显示: