Visual C# を使用してカスタム コレクションを実装する
この記事では、Visual C# でカスタム コレクションを実装する方法について説明します。 Microsoft .NET Framework 基本クラス ライブラリは、コレクション System.Collections.ICollection
インターフェイスの正式な定義を提供します。
元の製品バージョン: Visual C#
元の KB 番号: 307484
カスタム クラスに ICollection インターフェイスを実装する
インターフェイスは ICollection
インターフェイスから IEnumerable
継承します。 インターフェイスはICollection
、メソッドと、、SyncRoot
、および の 3 つの読み取り専用プロパティIsSynchronized
をCount
定義CopyTo
します。
ICollection
は GetEnumerator
インターフェイスから メソッドを IEnumerable
継承します。 カスタム コレクション クラスでは、 インターフェイスを実装する ICollection
必要があります。
インターフェイスを実装するには、次の ICollection
手順に従います。
Visual C# .NET で、Windows アプリケーションを作成します。
ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントし、[クラスの追加] をクリックして CustomCollection という名前のクラス モジュールを追加します。
クラス モジュールの先頭に次のサンプル コードを追加して、名前空間を
System.Collection
インポートします。using System.Collections;
モジュール内の他のコードを次のサンプル コードに置き換えます。
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }
わかりやすくするために、クラスは
CustomCollection
3 つの整数項目と count 変数を持つ配列を保持します。CopyTo
整数配列とインデックスをパラメーターとして受け取る メソッドを実装します。 このメソッドは、渡されたインデックスから始まる配列にコレクション内の項目をコピーします。 このメソッドを実装するには、パブリックCustomCollection
コンストラクターの後に次のコードを貼り付けます。void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }
GetEnumerator
からIEnumerable
インターフェイスによって継承される メソッドをICollection
実装します。 メソッドはGetEnumerator
、コレクションをEnumerator
反復処理できるオブジェクトを返します。 メソッドの後に次のサンプル コードをCopyTo
貼り付けます。IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }
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
作成する方法について説明します。
クラス モジュールの end class ステートメントの後に、次のサンプル コードを貼り付けます。
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }
メソッドが
intArr
呼び出されたときに クラスのCustomCollection
要素を保持するプライベート整数配列をGetEnumerator
宣言します。 フィールド メンバーはCursor
、列挙中に現在の位置を保持します。の コンストラクターをパラメーターとして追加し、ローカル
intArr
を これに設定しますintArr
。 メンバー フィールドの宣言の後に、次のサンプル コードを貼り付けます。public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }
メソッドと
MoveNext
メソッドをReset
実装します。 これを行うには、コンストラクターの後に次のコードを貼り付けます。void IEnumerator.Reset() { Cursor = -1; } bool IEnumerator.MoveNext() { if (Cursor < intArr.Length) Cursor++; return(!(Cursor == intArr.Length)); }
Reset
をCursor
-1 に設定し、MoveNext
をCursor
次の要素に移動します。MoveNext
成功した場合は True を 返します。によって指される
Current
項目を返す読み取り専用プロパティを実装しますCursor
。Cursor
が -1 の場合は、 がInvalidOperationException
生成されます。 メソッドの後に次のコードをMoveNext
貼り付けます。object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
各 に を使用してカスタム コレクションを反復処理する
Form1.csの [デザイン] タブで、ボタンをフォームにドラッグします。
ボタンをダブルクリックし、ボタンのイベントに次の
Click
サンプル コードを追加します。CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());
F5 キーを押してアプリケーションを実行し、ボタンをクリックします。
注:
メッセージ ボックスには、カスタム コレクション内の項目が表示されます。
これはどのように機能しますか? それぞれについて、 メソッドを GetEnumerator
呼び出してオブジェクトを Enumerator
作成し、 メソッドを MoveNext
呼び出して、 を最初の項目に設定 Cursor
します。 次に、現在のプロパティにアクセスして で MyObj
項目を取得します。 これは False を返すまでMoveNext
繰り返されます。