配列.Length / Array.Resize()
| 対応: | C# 1.0(2002) |
|---|
配列の要素数を取得する『Length』プロパティと、配列のサイズを変更する『Array.Resize()』メソッドです。
構文
// 配列の要素数を取得します。 配列.Length // 配列を newSize の要素数にリサイズします。元の配列への参照を書き換えます。 Array.Resize(ref T[] array, int newSize) // 多次元配列の特定の次元の要素数を取得します。 配列.GetLength(int dimension)
メンバー一覧
| メンバー | 概要 |
|---|---|
| Length | 配列の全要素数を返します。多次元配列の場合はすべての次元の要素数の積になります。 |
| Array.Resize(ref T[] array, int newSize) | 配列を newSize の長さに変更します。拡張した場合は新しい要素が既定値(数値なら 0、文字列なら null)で初期化されます。縮小した場合は末尾の要素が削除されます。 |
| GetLength(int dimension) | 指定した次元(0始まり)の要素数を返します。一次元配列では GetLength(0) が Length と同じ値になります。 |
サンプルコード
Length プロパティで要素数を取得し、for ループで全要素を処理します。
Program.cs
using System;
int[] scores = { 85, 92, 78, 95, 60 };
Console.WriteLine(scores.Length); // 5
for (int i = 0; i < scores.Length; i++)
{
Console.WriteLine($"[{i}] {scores[i]}点");
}
コンパイルして実行すると次のようになります。
dotnet run 5 [0] 85点 [1] 92点 [2] 78点 [3] 95点 [4] 60点
Array.Resize() で要素数を変更する
Array.Resize() を使うと、配列の要素数を増減できます。拡張した場合は新しい要素が既定値(文字列なら null)で初期化されます。縮小した場合は末尾の要素が削除されます。
ResizeSample.cs
using System;
string[] team = { "八神庵", "草薙京", "テリー・ボガード" };
Console.WriteLine(team.Length); // 3
Array.Resize(ref team, 5);
team[3] = "ブルー・マリー";
team[4] = "ゲーニッツ";
Console.WriteLine(team.Length); // 5
foreach (string name in team)
{
Console.Write(name + " ");
}
Console.WriteLine();
Array.Resize(ref team, 2);
Console.WriteLine(team.Length); // 2
Console.WriteLine(team[0]); // 八神庵
コンパイルして実行すると次のようになります。
dotnet run 3 5 八神庵 草薙京 テリー・ボガード ブルー・マリー ゲーニッツ 2 八神庵
多次元配列と GetLength()
2次元配列では Length は全要素数(行×列)を返します。各次元の要素数を個別に取得するには GetLength() を使います。引数は次元のインデックスで、0 が最初の次元(行)、1 が次の次元(列)です。
MultiDimSample.cs
using System;
// 3行×2列の2次元配列
int[,] grid = {
{ 85, 90 },
{ 72, 88 },
{ 95, 60 }
};
Console.WriteLine(grid.Length); // 6(全要素数)
Console.WriteLine(grid.GetLength(0)); // 3(行数)
Console.WriteLine(grid.GetLength(1)); // 2(列数)
for (int row = 0; row < grid.GetLength(0); row++)
{
for (int col = 0; col < grid.GetLength(1); col++)
{
Console.Write(grid[row, col] + " ");
}
Console.WriteLine();
}
コンパイルして実行すると次のようになります。
dotnet run 6 3 2 85 90 72 88 95 60
よくあるミス
よくあるミス: Array.Resize() は元の配列への参照を変える
Array.Resize() は内部で新しい配列を作成してコピーします。そのため、別の変数で元の配列を参照している場合、その変数は新しい配列を指しません。
using System;
// NG: backup は Resize 後も古い配列を参照したまま
string[] original = { "八神庵", "草薙京" };
string[] backup = original; // 同じ配列を参照
Array.Resize(ref original, 4);
original[2] = "テリー・ボガード";
original[3] = "不知火舞";
Console.WriteLine(original.Length); // 4
Console.WriteLine(backup.Length); // 2(backup は古い配列のまま)
修正後は次の通りです。
dotnet run 4 2
Array.Resize() を呼ぶと original が新しい配列を参照するように変わりますが、backup はリサイズ前の古い配列を参照し続けます。要素数が動的に変わる場合は List<T> の使用を検討してください。
using System;
using System.Collections.Generic;
// OK: List<T> を使えば参照の問題が起きない
List<string> team = new List<string> { "八神庵", "草薙京" };
team.Add("テリー・ボガード");
team.Add("不知火舞");
Console.WriteLine(team.Count); // 4
修正後は次の通りです。
dotnet run 4
概要
C# の配列は宣言時にサイズが固定されます。Array.Resize() は内部的に新しい配列を作成して要素をコピーするため、呼び出し頻度が高いとパフォーマンスに影響します。要素数が動的に変わる場合は、最初から『List<T>』の使用を検討してください。
配列の並べ替えには『Array.Sort() / Array.Reverse()』、要素の検索には『Array.IndexOf() / Array.Copy()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。