次の方法で共有


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

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

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

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

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

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

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

  2. ソリューション エクスプローラーでプロジェクト名を右クリックし、Add をポイントし、[クラスの追加] をクリックしてクラスモジュール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. IEnumerableからICollection インターフェイスによって継承されるGetEnumerator メソッドを実装します。 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 クラス ステートメントの後に、次のサンプル コードを貼り付けます。

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

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

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

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

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

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

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

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

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

  1. Form1.csDesign タブで、ボタンをフォームにドラッグします。

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

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

    Note

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

この処理のしくみ 各呼び出しでは、 GetEnumerator メソッドを呼び出して Enumerator オブジェクトを作成し、 MoveNext メソッドを呼び出して、 Cursor を最初の項目に設定します。 その後、現在のプロパティにアクセスして、 MyObj内の項目を取得します。 これは、 MoveNextFalse を返すまで繰り返されます。