【C#】ジェネリック型を使ったIEnumeratorの実装ガイド

この資料では、C#のジェネリック型を使用したIEnumerator<T>インターフェースの実装方法について解説します。この資料を通じて、クラスでジェネリック型を使用する方法と、IEnumeratorの主要なメソッドを実装する手順について学ぶことができます。


基本概念

C#のIEnumerator<T>インターフェースは、コレクション(配列やリストなど)を列挙するために使用されます。このインターフェースを実装することで、foreachループを使用してコレクション内の要素にアクセスできるようになります。

ジェネリック型Tを使用すると、特定の型に依存しない汎用的なクラスを作成することができ、コードの再利用性が向上します。


実装例

以下に、ArrayEnumerator<T>というクラスを例に、IEnumerator<T>インターフェースを実装する手順を示します。このクラスは、与えられた配列を列挙する役割を持ちます。

public class ArrayEnumerator<T> : IEnumerator<T>
{
    private T[] _array;
    private int _position = -1;

    public ArrayEnumerator(T[] array)
    {
        _array = array;
    }

    public T Current
    {
        get
        {
            if (_position < 0 || _position >= _array.Length)
                throw new InvalidOperationException();
            return _array[_position];
        }
    }

    object IEnumerator.Current => Current;

    public bool MoveNext()
    {
        _position++;
        return (_position < _array.Length);
    }

    public void Reset()
    {
        _position = -1;
    }

    public void Dispose()
    {
        // 必要なリソースのクリーンアップを行う。通常は何もしなくても良い。
    }
}

各部分の説明

クラス宣言

public class ArrayEnumerator<T> : IEnumerator<T>

<T>をクラス名に追加して、クラスがジェネリック型Tを受け取ることを示しています。この型は、配列の要素の型に対応します。

コンストラクタ

public ArrayEnumerator(T[] array)
{
    _array = array;
}

コンストラクタは、配列を受け取り、それを内部で保持します。この配列は列挙対象となります。

Currentプロパティ

public T Current
{
    get
    {
        if (_position < 0 || _position >= _array.Length)
            throw new InvalidOperationException();
        return _array[_position];
    }
}

Currentプロパティは、現在の要素を返します。配列の範囲外にアクセスしようとすると例外が発生します。

MoveNextメソッド

public bool MoveNext()
{
    _position++;
    return (_position < _array.Length);
}

このメソッドは、列挙子を次の要素に進めます。配列の末尾に到達するとfalseを返し、列挙を終了します。

Resetメソッド

public void Reset()
{
    _position = -1;
}

Resetメソッドは、列挙子を初期位置(最初の要素の前)にリセットします。

Disposeメソッド

public void Dispose()
{
    // 必要なリソースのクリーンアップを行う。通常は何もしなくても良い。
}

このメソッドは、列挙子が使用するリソースを解放しますが、今回の例では特に何も行いません。


まとめ

この資料では、ジェネリック型を使用したIEnumerator<T>の実装方法について学びました。このクラスを実装することで、任意の型の配列やコレクションを簡単に列挙できるようになります。ジェネリック型の使用により、コードの柔軟性が向上し、再利用性の高いクラスを作成できるようになります。


使用例

以下のコードは、このArrayEnumerator<T>クラスを利用する例です。

int[] numbers = { 1, 2, 3, 4, 5 };
ArrayEnumerator<int> enumerator = new ArrayEnumerator<int>(numbers);

while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}

このコードは、配列numbersの各要素を順に表示します。

C#

Posted by hidepon