C_sharp / Study / ICollection



はじめに

ICollectionインターフェイス

interface System.Collections.ICollection
{
   int Count { get; }               // 格納されている要素の数
   bool IsSynchronized{ get; }      // スレッドセーフであるかどうかを示す値。
   Object SyncRoot{ get; }          // このメソッドで返すオブジェクトを使用してコレクションと同期を取る。
   void CopyTo(Array a, int index); // 指定したインデックスから要素を配列にコピーする。
}
  • サイズ、列挙子、および同期メソッドを定義する。
  • IsSynchronized?, SyncRoot?はよく分からなかった。
    • スレッド間操作が絡むんだろうか?
  • ICollectionはIEnumerableインターフェイスを継承しているため、GetEnumerator?()メソッドも実装しなくてはならない。
    • ここではやらない。こっちを参照のこと。

コード

class MyCollection : System.Collections.ICollection
{
   private int[] array = { 10, 20, 30 };
   private int count;

   public MyCollection()
   {
       this.count = 3;
   }

   /// Count
   public int Count
   {
       get { return this.count; }
   }

   /// IsSynchronized
   public bool IsSynchronized
   {
       get { return false; }  // 実際のところよく分からない。
   }

   /// SyncRoot
   public Object SyncRoot
   {
       get { return this; }   // 実際のところよく分からない。
   }

   /// CopyTo
   public void CopyTo(Array a, int index)
   {
       foreach (int i in this.array)
       {
           a.SetValue(i, index);
           index++;
       }
   }

   /// GetEnumerator
   public System.Collections.IEnumerator GetEnumerator()
   {
       return null;  // ここでは内容は実装してないです。
   }
}
  • 内容的にArrayをラップしてるだけにしか見えないけど、とりあえず。

利用例

コード

MyCollection collection = new MyCollection();
int[] a1 = { 1, 2, 3, 4, 5};

collection.CopyTo(a1, 0);
foreach (int x in a1)
{
    Console.WriteLine(x);
}

出力

10
20
30
4
5
  • このページの例ではCopyTo?くらいしか実装してないからこんなところで。(Countはともかく)
  • GetEnumerator?も実装すればforeachとかも使えるようになるでしょう。
  • IsSynchronized?, SyncRoot?はよく分からない。

参考リンク

MenuBar


最新の20件

2015-05-15 2014-12-07 2008-11-17 2007-08-30 2007-04-21 2007-03-13 2007-03-12 2007-02-20 2007-02-14 2007-02-04 2006-11-26 2006-11-23 2006-11-20 2006-11-18 2006-11-13

  • counter: 367
  • today: 1
  • yesterday: 0
  • online: 1