配列は単純なデータの並びに見えますが、C# では System.Array クラスを継承するオブジェクトです。このページでは配列変数のコピーの挙動と、配列を操作する組み込みメソッドを学びます。
b = a)では同じ配列を指すことになると説明できるArray.Copy で独立したコピーを作れるLength・Rank・GetLength で配列の情報を取得できるArray.Sort・Array.Reverse・Array.IndexOf・Array.Copy・Array.Clear を使えるC# のすべての配列は System.Array クラスを継承しています。int[] を宣言するとき、実は System.Array のサブクラスのインスタンスが生成されています。
1
2
3
int[] scores = { 85, 72, 90, 68, 95 };
Console.WriteLine(scores.GetType()); // System.Int32[]
Console.WriteLine(scores is Array); // True
int[] scores のような変数に格納されるのは配列本体ではなく、配列がどこにあるかを示す参照です。
new を書くたびに新しい配列が生成されます。変数にはその配列への参照(どこにあるかという情報)が入ります。
1
2
3
int[] a = { 1, 2, 3 }; // new int[] { 1, 2, 3 } と同じ
int[] b = new int[] { 1, 2, 3 }; // new → 別の配列が作られる
// a と b は独立した別の配列
b = a と書くと参照がコピーされます。new が書かれていないので新しい配列は作られず、a と b は同じ配列を指すことになります。
1
2
3
4
5
int[] a = { 1, 2, 3 };
int[] b = a; // 参照のコピー(new がない → 同じ配列)
b[0] = 99;
Console.WriteLine(a[0]); // 99(a も変わっている!)
Array.Copy を使うと新しい配列に要素をコピーして独立させることができます。
Length — 全要素数(すべての次元を含む)。
Rank — 配列の次元数。1 次元配列は 1、2 次元は 2。
GetLength(n) — 指定した次元の要素数を返します。
書式:GetLength メソッド
1
int GetLength(int dimension);
| パラメータ | 型 | 説明 |
|---|---|---|
dimension |
int |
取得する次元のインデックス(0 始まり) |
1
2
3
4
int[] arr = { 10, 20, 30, 40 };
Console.WriteLine(arr.Length); // 4
Console.WriteLine(arr.Rank); // 1
Console.WriteLine(arr.GetLength(0)); // 4(0 次元目の要素数)
Array.Sort — 配列を昇順にソートします(元の配列を直接変更します)。
書式:Array.Sort メソッド
1
static void Array.Sort(Array array);
1
2
3
4
5
int[] nums = { 40, 10, 30, 20 };
Array.Sort(nums);
foreach (int n in nums)
Console.Write(n + " "); // 10 20 30 40
Array.Reverse — 配列の要素順を逆にします(元の配列を直接変更します)。
書式:Array.Reverse メソッド
1
static void Array.Reverse(Array array);
1
2
3
4
5
int[] nums = { 10, 20, 30, 40 };
Array.Reverse(nums);
foreach (int n in nums)
Console.Write(n + " "); // 40 30 20 10
Array.IndexOf — 指定した値が最初に見つかったインデックスを返します。見つからない場合は -1。
書式:Array.IndexOf メソッド
1
static int Array.IndexOf(Array array, object? value);
| パラメータ | 型 | 説明 |
|---|---|---|
array |
Array |
検索する配列 |
value |
object? |
検索する値 |
1
2
3
string[] fruits = { "apple", "banana", "cherry" };
Console.WriteLine(Array.IndexOf(fruits, "banana")); // 1
Console.WriteLine(Array.IndexOf(fruits, "grape")); // -1(見つからない)
Array.Copy — 配列の要素を別の配列にコピーします。b = a の代入とは異なり、Array.Copy はコピー先として new で新たに作った配列を使うため、2 つの配列が独立した状態になります。
書式:Array.Copy メソッド
1
static void Array.Copy(Array sourceArray, Array destinationArray, int length);
| パラメータ | 型 | 説明 |
|---|---|---|
sourceArray |
Array |
コピー元の配列 |
destinationArray |
Array |
コピー先の配列 |
length |
int |
コピーする要素数 |
1
2
3
4
5
6
7
int[] original = { 1, 2, 3 };
int[] copy = new int[3];
Array.Copy(original, copy, original.Length);
copy[0] = 99;
Console.WriteLine(original[0]); // 1(元の配列は変わらない)
Console.WriteLine(copy[0]); // 99
Array.Clear — 指定した範囲の要素を型の初期値(数値は 0、参照型は null)にリセットします。
書式:Array.Clear メソッド
1
static void Array.Clear(Array array, int index, int length);
| パラメータ | 型 | 説明 |
|---|---|---|
array |
Array |
対象の配列 |
index |
int |
リセット開始インデックス |
length |
int |
リセットする要素数 |
1
2
3
4
5
int[] nums = { 10, 20, 30, 40, 50 };
Array.Clear(nums, 1, 3); // インデックス 1 〜 3 を 0 に
foreach (int n in nums)
Console.Write(n + " "); // 10 0 0 0 50
1
2
3
4
5
6
7
8
9
10
int[] a = { 1, 2, 3 };
// ❌ NG: 代入は参照のコピー(中身はコピーされない)
int[] b = a;
b[0] = 99; // a[0] も 99 になる
// ✅ OK: Array.Copy で独立したコピーを作る
int[] c = new int[a.Length];
Array.Copy(a, c, a.Length);
c[0] = 99; // a[0] は変わらない
System.Array を継承するオブジェクトb = a では新しい配列は作られず同じ配列を指すnew を書くたびに新しい配列が生成されるArray.Copy を使うLength・Rank・GetLength(n) で配列の構造を確認できるArray.Sort・Array.Reverse で並び替え、Array.IndexOf で検索できるint[] a = {1,2,3}; int[] b = a; b[1] = 99; を実行後、a[1] の値は何ですか?Array.Sort と Array.Reverse を組み合わせて配列を降順に並べるコードを書いてください。次のコードで nums の最終的な内容は何ですか?
1
2
int[] nums = { 5, 10, 15, 20, 25 };
Array.Clear(nums, 2, 2);
99 です。b = a は参照のコピーのため(new が書かれていない)、b と a は同じ配列を指しています。
1
2
3
int[] nums = { 3, 1, 4, 1, 5 };
Array.Sort(nums); // 昇順: 1 1 3 4 5
Array.Reverse(nums); // 逆順: 5 4 3 1 1
{ 5, 10, 0, 0, 25 } です。インデックス 2 と 3 が 0 にリセットされます。多次元配列 では、行と列を持つ 2 次元配列を学びます。