英語で読む

次の方法で共有


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
派生
属性

次のコード例は、IEnumerable インターフェイスと IEnumerator インターフェイスを実装してカスタム コレクションを反復処理するためのベスト プラクティスを示しています。 この例では、これらのインターフェイスのメンバーは明示的に呼び出されませんが、コレクションを反復処理するための foreach (Visual Basic のFor Each) の使用をサポートするために実装されています。 この例は、完全なコンソール アプリです。 Visual Basic アプリをコンパイルするには、プロジェクトの [プロパティ] ページで、Startup オブジェクトSub Main に変更します。

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を返す 1 つのメソッド GetEnumeratorが含まれています。 IEnumerator では、Current プロパティと MoveNext メソッドと Reset メソッドを公開することで、コレクションを反復処理する機能が提供されます。

foreach (Visual Basic のFor Each) 構文を有効にするには、コレクション クラスに IEnumerableIEnumerator を実装することをお勧めしますが、IEnumerable の実装は必要ありません。 コレクションに IEnumerableが実装されていない場合でも、インターフェイス、クラス、または構造体を返す GetEnumerator メソッドを提供することで、反復子パターンに従ってこの構文をサポートする必要があります。 Visual Basic を使用する場合は、GetEnumeratorによって返される IEnumerator 実装を指定する必要があります。 C# を使用して開発するときは、IEnumeratorで説明されているように、Current プロパティと MoveNext メソッドと Reset メソッドを含むクラスを指定する必要がありますが、クラスは IEnumeratorを実装する必要はありません。

メソッド

GetEnumerator()

コレクションを反復処理する列挙子を返します。

拡張メソッド

Cast<TResult>(IEnumerable)

IEnumerable の要素を指定した型にキャストします。

OfType<TResult>(IEnumerable)

指定した型に基づいて、IEnumerable の要素をフィルター処理します。

AsParallel(IEnumerable)

クエリの並列化を有効にします。

AsQueryable(IEnumerable)

IEnumerableIQueryableに変換します。

適用対象

製品 バージョン
.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

こちらもご覧ください