はじめに
プログラムを作っていると、必ずといっていいほど効率的なデータの取り扱い方について考えさせられます。例えば電卓プログラムであれば木構造を使って必要なデータを保持するのが良い、電話帳のようなプログラムならばデータをリストとして保持すると良い、などと言われます。
一般にデータ構造と呼ばれるこれらのうち、単純なものはプログラムを作るたびに自前で実装したり、自分自身で使いやすいライブラリを構築したりしてもよいでしょう。しかし、ハッシュや辞書、動的に大きさの変わる配列といった実装が少し面倒なものについては、既存のライブラリがあればそれを利用したいと考えるのが人の常だと思います。
幸い、JavaやC#といったモダンな言語では、これらのデータ構造は標準ライブラリを通じ、コレクションと呼ばれる機能の一部として提供されており、手軽に使える状態が整っています。
そこで本稿では、.NET Frameworkで利用できるSystem.Collection名前空間に属している代表的な各種データ構造について、例を交えながら紹介したいと思います。
対象読者
- .NET Frameworkのコレクションについて知りたいという方
なお、サンプルプログラムはC#を使って書いていますが、VB.NETなど、他の.NET系言語でも同じ機能を利用することが可能です。また、すべてのサンプルプログラムはVisual Studio 2008 Professional Editionで、ターゲットフレームワークを.NET Framework 2.0にした上で動作確認を行っています。
System.Collections名前空間
.NET Frameworkで利用できるコレクション機能は、すべてSystem.Collections名前空間以下に整備されています。Collections名前空間の下にはさらにGenerics名前空間とObjectModel名前空間、さらにSpecialized名前空間が区切られており、それぞれ総称型を利用できるコレクション、オブジェクトモデルに基づいた再利用可能なコレクション、厳密に型指定された特殊なコレクションが納められています。
ですが、本稿で相手にするのはCollections名前空間直下に納められているコレクションです。その中でも特に、表1に挙げたものについて紹介したいと思います。
クラス名 | 概略 |
---|---|
ArrayList | 動的配列リストを提供 |
BitArray | ビット配列を提供 |
Hashtable | 柔軟なハッシュテーブルを提供 |
SortedList | 特定のキーによってソートされるリストを提供 |
Queue | 待ち行列型データ構造を提供 |
Stack | 積み上げ型データ構造を提供 |
最近話題にあがることが多いGenerics(総称型)を使ったコレクションではなく、Collections直下の機能を使う最大の利点は、サポートされているフレームワークの幅が広いという点にあります。
なお、記事中で実行結果を紹介しているプログラムのソースコードは、記事添付のサンプルプログラムに収められていますので、詳しくはそちらをご参照ください。
コレクションは非常に便利なのでついつい何にでも使ってしまいがちですが、注意しなければいけない点もあります。
何より注意しなければいけないのは、多くのコレクションは格納されているデータについて、そのデータの型情報を事前に知ることができないという点です。つまり、正しく用いるためにはコレクションから取り出したデータの型を調べ、適切な型のオブジェクトであるかを判断しながら処理を進めていかなければなりません。
また、型が決定されていないので処理速度は比較的遅めです。幅広いフレームワークで使えることを捨て、速度を重視したいのであれば、Generics名前空間以下のクラスライブラリ利用すると良いでしょう。