.NET TIPS

配列のサイズを変更するには?(Resize編)[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/05/12

 「TIPS:配列のサイズを変更するには?」で紹介しているように、.NET Framework 1.xで配列のサイズを変更するには、新しいサイズの別の配列を宣言し各要素をコピーしなければならなかった(VBでは「Redim Preserveステートメント」でも可能)。

 しかし.NET Framework 2.0のArrayクラス(System名前空間)には、配列のサイズを変更するためのResizeメソッドが追加されており、既存の配列を任意のサイズに変更することができる。

ArrayクラスのResizeメソッド

 Resizeメソッドは次のような構文を持つ静的なジェネリック・メソッドだ。

public static void Resize<T>(ref T[] array, int newSize)
Public Shared Sub Resize(Of T)(ByRef array As T(), newSize As Integer)
Resizeメソッドの構文(上:C#、下:VB)

 第1パラメータにはサイズを変更したい配列、第2パラメータには新しいサイズを指定する。型パラメータ「T」には配列の要素の型を指定するが、これは第1パラメータに指定した配列から推論させることができるため、通常は型パラメータの指定を省略できる。

 以下にResizeメソッドを使用したサンプル・プログラムを示す。

// arrayresize.cs

using System;

public class ArrayResize {
  static void Main() {
    string[] numbers = {"one", "two", "three"};
    Console.WriteLine(numbers.Length); // 出力:3

    Array.Resize(ref numbers, 4);

    // 上記は<string>を省略している
    // Array.Resize<string>(ref numbers, 4);

    numbers[3] = "four";
    Console.WriteLine(numbers.Length); // 出力:4
  }
}

// コンパイル方法:csc arrayresize.cs
Resizeメソッドにより配列をリサイズするC#のサンプル・プログラム(arrayresize.cs)
arrayresize.csのダウンロード

' arrayresize.vb

Imports System

Public Class ArrayResize
  Shared Sub Main()
    Dim numbers As String() = {"one", "two", "three"}
    Console.WriteLine(numbers.Length) ' 出力:3

    Array.Resize(numbers, 4)

    ' 上記は(Of String)を省略している
    ' Array.Resize(Of String)(numbers, 4)

    numbers(3) = "four"
    Console.WriteLine(numbers.Length) ' 出力:4
  End Sub
End Class

' コンパイル方法:vbc arrayresize.vb
Resizeメソッドにより配列をリサイズするVBのサンプル・プログラム(arrayresize.vb)
arrayresize.vbのダウンロード

 上述したように、VBではReDim Preserveステートメントにより、Resizeメソッドと同様に配列の内容を保持したまま、そのサイズを変更することができる。以下にそのサンプル・プログラムを示す。

' arrayredim.vb

Imports System

Public Class ArrayRedim
  Shared Sub Main()
    Dim numbers As String() = {"one", "two", "three"}
    Console.WriteLine(numbers.Length) ' 出力:3

    ReDim Preserve numbers(3)

    numbers(3) = "four"
    Console.WriteLine(numbers.Length) ' 出力:4
  End Sub
End Class

' コンパイル方法:arrayredim.vb
Redimステートメントにより配列をリサイズするVBのサンプル・プログラム(arrayredim.vb)
arrayredim.vbのダウンロード

 もちろん.NET Frameworkでは配列のサイズは実際には変更できないため(配列の宣言時にサイズが決定する)、ResizeメソッドもRedimステートメントも内部的には新しいサイズの配列を宣言し、全要素をコピーするという処理を行っているだけだ。このためサイズ変更前と後では、その配列は同一のオブジェクトではないという点には注意が必要だ。

.NET Framework 2.0ではArrayListクラスの代わりにListクラス

 前掲のTIPSの後半では、宣言時にサイズを特定できない場合に、配列の代わりとして使用できるArrayListクラス(System.Collections名前空間)についても説明しているが、.NET Framework 2.0では新しいListクラス(System.Collections.Generic名前空間)を利用するのが一般的だ。

 Listクラスはジェネリック・クラスであり、宣言時に要素の型を指定することにより、追加できる要素の型を厳密に決めることができArrayListクラスに比べてタイプセーフである。以下にListクラスの利用例を示す。

List<string> numList = new List<string>();

numList.Add("one"); // 要素の追加
numList.Add("two");
numList.Add("three");

string first = numList[0]; // 要素の取得

string[] numArray = numList.ToArray(); // 配列へ変換
Dim numList As New List(Of String)

numList.Add("one") ' 要素の追加
numList.Add("two")
numList.Add("three")

Dim first As String = numList(0) ' 要素の取得

Dim numArray As String() = numList.ToArray() ' 配列へ変換
Listクラスの利用例(上:C#、下:VB)

 要素の取得時や配列への変換時には、ArrayListクラスでは必要だったダウンキャストも不要である。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:配列
使用ライブラリ:Arrayクラス(System名前空間)
使用ライブラリ:Listクラス(System.Collections.Generic名前空間)
関連TIPS:配列のサイズを変更するには?

この記事と関連性の高い別の.NET TIPS
配列のサイズを変更するには?
C#で配列を宣言するには?
配列を連結するには[C#/VB]
VB.NETで配列を宣言するには?
Windowsフォームでサイズ変更の範囲を制限するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH