.NET TIPS

配列のサイズを変更するには?

デジタルアドバンテージ
2003/06/13

 .NET Frameworkでは、配列のサイズ(要素数)はそれを宣言したときに決定し、以降そのサイズを変更することはできない。例えば、次のC#のコードは文字列型の配列を宣言し、同時に初期化している。

string[] origNumbers = {"one", "two", "three"};

 サイズの指定は省略しているが、3つの文字列を初期要素として設定しているので、配列のサイズは3に決まる。このあとで4番目の要素を追加する必要が生じても、変数numberが参照している配列オブジェクトの要素数を4にすることはできない。

 このような場合に取り得る手段の1つは、サイズの異なる配列を別に宣言し、元の配列にあった値をコピーすることだ。具体的には次のようにすればよい。

string[] newNumbers = new string[4];
Array.Copy(origNumbers, newNumbers, origNumbers.Length);

 ここで配列のコピーを行うために、Arrayクラス(System名前空間)のCopyメソッドを使用している。このメソッドの最後のパラメータには、コピーする要素の数を指定する。配列の要素数を取得するためのLengthプロパティは、Arrayクラスで定義されたものだが、配列はArrayクラスのインスタンスであるためこのような記述が可能だ(実際にはArrayクラスは抽象クラスだが、そのインスタンスを作成するためのstaticなメソッド「CreateInstance」を持っている)。

 上記のコードに続けて次のようにすれば、見かけ上は配列のサイズが変更されたように操作できる。

origNumbers = newNumbers;
origNumbers[3] = "four";

 Visual Basic .NETには、配列を再割り当てするRedimステートメント(配列の内容を保ったままの再割り当ては「Redim Preserve」)が用意されているが、その内部処理はいま述べたようなものとほぼ同じだ。

動的なサイズ変更が可能なArrayListクラス

 宣言時にサイズが決まらないような用途には、配列の代わりにArrayListクラス(System.Collections名前空間)を使用すべきだ。ArrayListクラスは、「配列」ではなく、「コレクション」と一般に呼ばれ、動的な要素の追加や削除が可能となっている。

 要素の追加は簡単で、次のようにAddメソッドを使用するだけだ。これにより、ArrayListクラスがその内部で管理している、動的にサイズ変更可能な配列の末尾に要素が追加される。

ArrayList alNumbers = new ArrayList();
alNumbers.Add("one");
alNumbers.Add("two");
alNumbers.Add("three");
alNumbers.Add("four");

 各要素の値の読み書きは、ArrayListクラスに実装されたインデクサの機能により、alNumber[0]、alNumbers[1]、……という形式で配列と同様に行える。

 ただし、要素値の読み出しに関しては少し注意が必要だ。配列は宣言時に各要素の「型」を指定できる。これに対して、Addメソッドのパラメータの型はobject型であり、これはどのような型のオブジェクトでも追加できることを意味している。このため各要素を取り出して元の型の変数に代入するような場合には、「ダウンキャスト」が必要となる。つまり、次のようにしてキャストしなければならない。

string firstNumber = (string)alNumbers[0];

 この点が配列と異なり少し面倒なところだ。プログラマーはArrayListオブジェクトの要素の型を意識しておかなければならない。もしそれ以上要素を追加することがないなら、次のようにしてToArrayメソッドにより、ArrayListオブジェクトの要素を配列にコピーしてしまってもよい。

string[] arNumbers = (string[])alNumbers.ToArray(typeof(string));

 このとき、「alNumbers.Add(5);」のように、コピーしようとする先の配列の型とは異なる型の要素をArrayListオブジェクトに追加している場合には、当然ながらToArrayメソッドの呼び出しは失敗し、例外が発生する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:配列
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:ArrayListクラス(System.Collections名前空間)
 
この記事と関連性の高い別の.NET TIPS
C#で配列を宣言するには?
配列のサイズを変更するには?(Resize編)
VB.NETで配列を宣言するには?
配列を連結するには[C#/VB]
配列の一部だけをコピーするには?[C#/VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間