.NET & Control > 要素数が不確定な配列(Redimの代用?)
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
要素数が不確定な配列(Redimの代用?)
「要素数が不確定な配列」とは、事前に配列の個数が分からないというケースです。例えば、ファイルに書かれているテキストの行数などは読んでみなければ解りません。
まず、基本をおさらいしておきましょう。
- C#やVBの配列はArrayオブジェクト(すべての配列型の抽象基本型)
C や C++ のように単なるアドレス指定可能な連続のメモリ領域ではない - Arrayクラス メンバが使用できる
- BasicにはRedimという現在のデータを維持しながら拡張する機能がある
旧仕様(VB6)を実装しているだけ、C#にこの機能はない
つまり、C#やVBの配列はArrayオブジェクトなので、Arrayクラスを調べてみると
配列要素内における、値の変更やCopy、Find、Sort機能などを有していますが、Add(追加)機能はありません(言語仕様で規定されています)。
因みに、CやC++でCopy、Find、Sortなどを行う場合、コードを書く必要がありますが、.NET環境では
配列の再割り当て
それでは、VBの ReDim文(配列の再割り当て)はどうなっているのでしょう?
新しい配列を作り、古い配列要素分を新しい配列にコピーして、新しい配列を有効な配列としています。
C#ではReDim文はサポートされていませんが、これを実現する場合
int[] OriginalArray = { 1, 2, 3 }; int[] NewArray = new int[4]; if (NewArray.Length > OriginalArray.Length Array.Copy(OriginalArray, NewArray, OriginalArray.Length); else Array.Copy(OriginalArray, NewArray, NewArray.Length); OriginalArray= NewArray; OriginalArray[3] = 4;
となります。
本題に戻ります。
事前に配列の個数が分からないというケースとはどんな場合でしょうか?
リソースの読み込みやオペレーションされるまで、データ量が全く分からないといったケースです。
.NET Framework Class Libraryでは、ArrayList または List<T> が用意されています。
ArrayListは、オブジェクトの配列です。そのため、利用(参照)する場合は、キャスト(型変換)が必要です。
List<T> は、宣言時に型を指定するため、そのためそのまま利用することができます。
ArrayList および List<T> はListとなっていますが、アルゴリズムのリストは使っていません。内部は配列です。追加する場合は、ReDimサンプルと同様の処理を行っています。