3

IEnumerable(T)とカスタムIEnumerator(T )を実装するカスタム コレクションを作成しました。

また、次のようなカスタム コレクションに Add() メソッドを追加しました。

public void Add(T item)
{
    T[] tempArray = new T[_array.Length + 1];

    for (int i = 0; i < _array.Length; i++)
    {
        tempArray[i] = _array[i];
    }

    tempArray[_array.Length] = item;

    _array = tempArray;
    tempArray = null;
}

実装は、この例http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspxに基づいています。

配列で foreach ループを実行するとき、コレクションの変更 (ループ内で Add() を呼び出すなど) を防ぎ、新しい InvalidOperationException をスローしたいと考えています。どうすればそれができるでしょうか?

4

3 に答える 3

5

クラス内にバージョン ID が必要です。へのエントリでそれを増やしAddます。イテレータを (GetEnumerator()呼び出しで) 作成するときは、バージョン番号を覚えておく必要があります。各反復で、バージョン番号がまだ開始時のものであるかどうかを確認し、そうでない場合はスローします。

于 2011-11-16T15:22:14.803 に答える
4

コレクションが変更されるたびにインクリメントできるフィールドをコレクションに追加できます。列挙子が作成されると、このフィールドの値が列挙子に格納されます。列挙子を使用する場合、フィールドの現在の値が、列挙子の作成時に格納された値と同じであることを確認します。そうでない場合は、InvalidOperationException.

于 2011-11-16T15:22:35.557 に答える
1

コードで一時配列の代わりにリストを使用できますが、いずれにしてもデフォルトで InvalidOperationException がスローされます。次に、汎用バージョンの IEnumerable を使用して取得でき、カスタム イテレータを作成するという難しい作業を行う必要がない場合があります。

于 2011-11-16T15:43:48.613 に答える