可変長のデータを扱えるのですが、型の情報が欠落するため、取り出した後にキャスト等の処理が必要になるという手間があります。
System.Colections.Generic名前空間に定義されているジェネリクスコレクションでは型変換の手間がなくなったため、今では使用機会があまりありません。
使用機会は減りましたが、そのデータ構造は重要なものであり、型情報を持つジェネリクスコレクションでも同様に使われます。
ArrayList
配列を可変長にしたようなもの。Add,Remove,Insert,Clearなど一通りの操作が出来るメソッド群も定義されています。
ArrayList array = new ArrayList();
array .Add("Red");
array .Add("Blue");
array .Add("Yellow");
array .RemoveAt(1);
int count = arrayList.Count; // 2
Queue
FIFO(First In First Out)と呼ばれる方式。最初に入ったものから順番に取り出す。受付に並ぶ人のようなもの。キューに挿入することをエンキュー、取り出すことをデキュー、取り出さないけど次の対象を覗くことをピークという。
Queue queue = new Queue();
queue.Enqueue("AAAA");
queue.Enqueue("BBBB");
queue.Enqueue("CCCC");
string value1 = (string)queue.Dequeue(); // AAAA 先頭の値を削除し取得
string value2 = (string)queue.Peek(); // BBBB 先頭の値を削除せず取得
string value3 = (string)queue.Dequeue(); // BBBB 先頭の値を削除し取得
Stack
LIFO(Last In First Out)と呼ばれる方式。最後に入ったものから順番に取り出す。メソッドの実行とリターン順のようなもの。スタックに積むことをプッシュ、取り出すことをポップ、取り出さないけど次の対象を覗くことをピークという。
Stack stack = new Stack();
stack.Push("AAAA");
stack.Push("BBBB");
stack.Push("CCCC");
string value4 = (string)stack.Pop(); // CCCC 最後の値を削除し取得
string value5 = (string)stack.Peek(); // BBBB 最後の値を削除せず取得
string value6 = (string)stack.Pop(); // BBBB 最後の値を削除し取得
HashTable
キーと値との組み合わせの集合。辞書の項目名と説明の組み合わせみたいなもの。キーの重複はできない。
Hashtable hashTable = new Hashtable();
hashTable.Add("us", "United States");
hashTable.Add("jp", "Japan");
hashTable.Add("fr", "France");
string country = (string)hashTable["jp"]; // Japan
bool isExistKey = hashTable.ContainsKey("uk"); // false
foreach(DictionaryEntry entry in hashTable)
{
Console.WriteLine("KEY:{entry.Key},VALUE{entry.Value}");
}
コレクションの独自実装
System.Collections名前空間には独自にコレクションを実装する際に継承すべきインタフェースや基底クラスが定義されています。これもジェネリクスコレクションの登場で独自実装する機会がほぼ無くなりました。