英語で読む

次の方法で共有


IEnumerator インターフェイス

定義

非ジェネリック コレクションに対する単純な反復処理をサポートします。

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

次のコード例は、カスタム コレクションの IEnumerable インターフェイスと IEnumerator インターフェイスの実装を示しています。 この例では、これらのインターフェイスのメンバーは明示的に呼び出されませんが、コレクションを反復処理するための foreach (Visual Basic のfor each) の使用をサポートするために実装されています。

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

注釈

IEnumerator は、すべての非ジェネリック列挙子の基本インターフェイスです。 その一般的な同等のインターフェイスは、System.Collections.Generic.IEnumerator<T> インターフェイスです。

C# 言語の foreach ステートメント (Visual Basic のfor each) では、列挙子の複雑さが隠されます。 そのため、列挙子を直接操作するのではなく、foreach を使用することをお勧めします。

列挙子を使用してコレクション内のデータを読み取ることができますが、基になるコレクションを変更するために使用することはできません。

Reset メソッドは COM 相互運用性のために提供されており、完全に実装する必要はありません。代わりに、実装者は NotSupportedExceptionをスローできます。

最初は、列挙子はコレクション内の最初の要素の前に配置されます。 Currentの値を読み取る前に、MoveNext メソッドを呼び出して列挙子をコレクションの最初の要素に進める必要があります。それ以外の場合、Current は未定義です。

Current は、MoveNext または Reset が呼び出されるまで、同じオブジェクトを返します。 MoveNext Current を次の要素に設定します。

MoveNext がコレクションの末尾を渡す場合、列挙子はコレクション内の最後の要素の後に配置され、MoveNextfalseを返します。 列挙子がこの位置にある場合、後続の MoveNext の呼び出しでも falseが返されます。 MoveNext の最後の呼び出しが false返された場合、Current は未定義です。

Current をコレクションの最初の要素に再度設定するには、実装されている場合は Resetを呼び出し、その後に MoveNextを呼び出すことができます。 Reset が実装されていない場合は、コレクションの最初の要素に戻る新しい列挙子インスタンスを作成する必要があります。

要素の追加、変更、削除など、コレクションに変更が加えられた場合、列挙子の動作は未定義になります。

列挙子は、コレクションへの排他的アクセス権を持っていません。したがって、コレクションを通じた列挙は、本質的にスレッド セーフなプロシージャではありません。 コレクションが同期されている場合でも、他のスレッドはコレクションを変更できるため、列挙子は例外をスローします。 列挙中のスレッド セーフを保証するには、列挙全体の間にコレクションをロックするか、他のスレッドによって行われた変更によって発生する例外をキャッチします。

プロパティ

Current

列挙子の現在位置にあるコレクション内の要素を取得します。

メソッド

MoveNext()

列挙子をコレクションの次の要素に進めます。

Reset()

列挙子を最初の位置 (コレクション内の最初の要素の前) に設定します。

適用対象

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

こちらもご覧ください