Visual C# を使用してカスタム コレクションを実装する

この記事では、Visual C# でカスタム コレクションを実装する方法について説明します。 Microsoft .NET Framework 基本クラス ライブラリは、コレクション System.Collections.ICollection インターフェイスの正式な定義を提供します。

元の製品バージョン: Visual C#
元の KB 番号: 307484

カスタム クラスに ICollection インターフェイスを実装する

インターフェイスは ICollection インターフェイスから IEnumerable 継承します。 インターフェイスはICollection、メソッドと、、SyncRoot、および の 3 つの読み取り専用プロパティIsSynchronizedCount定義CopyToします。 ICollectionGetEnumerator インターフェイスから メソッドを IEnumerable 継承します。 カスタム コレクション クラスでは、 インターフェイスを実装する ICollection 必要があります。

インターフェイスを実装するには、次の ICollection 手順に従います。

  1. Visual C# .NET で、Windows アプリケーションを作成します。

  2. ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントし、[クラスの追加] をクリックして CustomCollection という名前のクラス モジュールを追加します。

  3. クラス モジュールの先頭に次のサンプル コードを追加して、名前空間を System.Collection インポートします。

    using System.Collections;
    
  4. モジュール内の他のコードを次のサンプル コードに置き換えます。

    public class CustomCollection : ICollection
    {
        private int[] intArr = {1,5,9};
        private int Ct;
    
        public CustomCollection()
        {
            Ct=3;
        }
    }
    

    わかりやすくするために、クラスは CustomCollection 3 つの整数項目と count 変数を持つ配列を保持します。

  5. CopyTo整数配列とインデックスをパラメーターとして受け取る メソッドを実装します。 このメソッドは、渡されたインデックスから始まる配列にコレクション内の項目をコピーします。 このメソッドを実装するには、パブリック CustomCollection コンストラクターの後に次のコードを貼り付けます。

    void ICollection.CopyTo(Array myArr, int index)
    {
        foreach (int i in intArr)
        {
            myArr.SetValue(i,index);
            index = index+1;
        }
    }
    
  6. GetEnumeratorからIEnumerableインターフェイスによって継承される メソッドをICollection実装します。 メソッドは GetEnumerator 、コレクションを Enumerator 反復処理できるオブジェクトを返します。 メソッドの後に次のサンプル コードを CopyTo 貼り付けます。

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator(intArr);
    }
    
  7. 3 つの読み取り専用プロパティを実装するには、 メソッドの後に次のコードを GetEnumerator 貼り付けます。

    // The IsSynchronized Boolean property returns True if the
    // collection is designed to be thread safe; otherwise, it returns False.
    bool ICollection.IsSynchronized
    {
        get
        {
            return false;
        }
    }
    
    // The SyncRoot property returns an object, which is used for synchronizing
    // the collection. This returns the instance of the object or returns the
    // SyncRoot of other collections if the collection contains other collections.
    object ICollection.SyncRoot
    {
        get
        {
            return this;
        }
    }
    
    // The Count read-only property returns the number
    // of items in the collection.
    int ICollection.Count
    {
        get
        {
            return Ct;
        }
    }
    

GetEnumerator メソッドの列挙子オブジェクトを実装する

このセクションでは、 を反復処理CustomCollectionできるクラスをEnumerator作成する方法について説明します。

  1. クラス モジュールの end class ステートメントの後に、次のサンプル コードを貼り付けます。

    public class Enumerator : IEnumerator
    {
        private int[] intArr;
        private int Cursor;
    }
    

    メソッドが intArr 呼び出されたときに クラスの CustomCollection 要素を保持するプライベート整数配列を GetEnumerator 宣言します。 フィールド メンバーは Cursor 、列挙中に現在の位置を保持します。

  2. の コンストラクターをパラメーターとして追加し、ローカルintArrを これに設定しますintArr。 メンバー フィールドの宣言の後に、次のサンプル コードを貼り付けます。

    public Enumerator(int[] intarr)
    {
        this.intArr = intarr;
        Cursor = -1;
    }
    
  3. メソッドと MoveNext メソッドをReset実装します。 これを行うには、コンストラクターの後に次のコードを貼り付けます。

    void IEnumerator.Reset()
    {
        Cursor = -1;
    }
    bool IEnumerator.MoveNext()
    {
        if (Cursor < intArr.Length)
            Cursor++;
    
        return(!(Cursor == intArr.Length));
    }
    

    ResetCursor-1 に設定し、 MoveNextCursor 次の要素に移動します。 MoveNext 成功した場合は True を 返します。

  4. によって指される Current 項目を返す読み取り専用プロパティを実装します CursorCursor-1 の場合は、 がInvalidOperationException生成されます。 メソッドの後に次のコードを MoveNext 貼り付けます。

    object IEnumerator.Current
    {
        get
        {
            if((Cursor < 0) || (Cursor == intArr.Length))
                throw new InvalidOperationException();
            return intArr[Cursor];
        }
    }
    

各 に を使用してカスタム コレクションを反復処理する

  1. Form1.csの [デザイン] タブで、ボタンをフォームにドラッグします。

  2. ボタンをダブルクリックし、ボタンのイベントに次の Click サンプル コードを追加します。

    CustomCollection MyCol = new CustomCollection();
    
    foreach (object MyObj in MyCol)
        MessageBox.Show(MyObj.ToString());
    
  3. F5 キーを押してアプリケーションを実行し、ボタンをクリックします。

    注:

    メッセージ ボックスには、カスタム コレクション内の項目が表示されます。

これはどのように機能しますか? それぞれについて、 メソッドを GetEnumerator 呼び出してオブジェクトを Enumerator 作成し、 メソッドを MoveNext 呼び出して、 を最初の項目に設定 Cursor します。 次に、現在のプロパティにアクセスして で MyObj項目を取得します。 これは False を返すまでMoveNext繰り返されます。