C#の配列:効率的なデータ格納とアクセスの完全ガイド
配列は、同一型の要素を固定サイズの順序付きコレクションとして格納します。配列はデータのコレクションを格納するために使用されますが、同一型の変数が連続したメモリ位置に格納されているコレクションと考える方が便利なことが多いです。
number0, number1, ..., number99 のように個別の変数を宣言する代わりに、numbers という1つの配列変数を宣言し、numbers[0], numbers[1], ..., numbers[99] で個々の変数を表現します。配列の特定の要素にはインデックスでアクセスします。
すべての配列は連続したメモリ位置で構成されます。最も低いアドレスが最初の要素、最も高いアドレスが最後の要素に対応します。

配列の宣言
C#で配列を宣言するには、以下の構文を使用します。
datatype[] arrayName;
ここで、
datatype- 配列の要素の型を指定[]- 配列のランク(次元)を指定。サイズを表すarrayName- 配列の名前を指定
宣言例
double[] balance;
配列の初期化
配列を宣言しただけではメモリ上で初期化されません。配列変数を初期化するときに値を割り当てます。配列は参照型なので、インスタンスを作成するにはnewキーワードを使用します。
double[] balance = new double[10];
配列への値の代入
インデックスを使用した個別代入
double[] balance = new double[10];
balance[0] = 4500.0;
宣言時の初期化
double[] balance = { 2340.0, 4523.69, 3421.0 };
サイズ指定付き初期化
int[] marks = new int[5] { 99, 98, 92, 97, 95 };
サイズ省略初期化
int[] marks = new int[] { 99, 98, 92, 97, 95 };
配列のコピー(参照のコピー)
int[] marks = new int[] { 99, 98, 92, 97, 95 };
int[] score = marks; // 同じメモリ位置を参照
配列を作成すると、C#コンパイラは配列の型に応じて各要素をデフォルト値で暗黙的に初期化します。例えば、int配列のすべての要素は0で初期化されます。
配列要素へのアクセス
要素には、配列名に続いて角括弧でインデックスを指定してアクセスします。
double salary = balance[9];
宣言、代入、アクセスの総合例
using System;
namespace ArrayApplication {
class MyArray {
static void Main(string[] args) {
int[] n = new int[10];
int i, j;
// 配列要素の初期化
for (i = 0; i < 10; i++) {
n[i] = i + 100;
}
// 各要素の出力
for (j = 0; j < 10; j++) {
Console.WriteLine("Element[{0}] = {1}", j, n[j]);
}
Console.ReadKey();
}
}
}
実行結果:
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
foreachループの使用
前の例ではforループで各要素にアクセスしましたが、foreachステートメントを使用して配列を反復処理することもできます。
using System;
namespace ArrayApplication {
class MyArray {
static void Main(string[] args) {
int[] n = new int[10];
for (int i = 0; i < 10; i++) {
n[i] = i + 100;
}
foreach (int j in n) {
int i = j - 100;
Console.WriteLine("Element[{0}] = {1}", i, j);
}
Console.ReadKey();
}
}
}
重要な配列関連概念
| No. | 概念と説明 |
|---|---|
| 1 | 多次元配列 C#は多次元配列をサポート。最も単純な形は2次元配列。 |
| 2 | ジャグ配列(配列の配列) 各行の長さが異なる多次元配列。 |
| 3 | 配列の関数渡し インデックスなしで配列名を指定して、配列への参照を関数に渡せる。 |
| 4 | 可変長パラメータ(params配列) 不明な数のパラメータを関数に渡すために使用。 |
| 5 | ArrayクラスSystem名前空間で定義。すべての配列の基底クラスで、配列操作のプロパティとメソッドを提供。 |
多次元配列の例
// 2次元配列(3行4列)
int[,] matrix = new int[3, 4] {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// アクセス
int value = matrix[1, 2]; // 7
// 全要素走査
for (int i = 0; i < matrix.GetLength(0); i++) {
for (int j = 0; j < matrix.GetLength(1); j++) {
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
ジャグ配列の例
// ジャグ配列(各行の長さが異なる)
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5, 6 };
jagged[2] = new int[] { 7, 8, 9 };
// アクセス
Console.WriteLine(jagged[1][2]); // 5
Arrayクラスの主なメソッド/プロパティ
Length- 要素の総数を取得Rank- 次元数を取得Sort()- 配列をソートReverse()- 配列を反転IndexOf()- 要素のインデックスを検索Copy()- 配列をコピー(ディープコピー)Resize()- 配列のサイズを変更
ベストプラクティス
- サイズが固定で高速なアクセスが必要な場合は配列を使用
- サイズが動的に変わる場合は
List<T>を検討 - 多次元配列(
[,])vs ジャグ配列([][]):メモリ効率は多次元、柔軟性はジャグ配列 foreachは読み取り専用走査に最適(書き込み不可)- 配列の境界チェックは自動で行われるが、インデックスエラーには注意
C言語
- ボールグリッドアレイ(BGA)完全ガイド:高密度PCB技術のすべて
- C# 配列をマスターする:宣言、初期化、操作
- C# ジャグ配列をマスターする:宣言、初期化、アクセス
- C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
- C言語で1次元・2次元配列を関数に渡す方法 – 実践ガイド
- C言語における配列とポインタの関係を理解する
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- C++動的配列の確保をマスター:コード例付き実践ガイド
- MATLAB:多次元配列と特殊配列をマスターする
- Java配列コピー技法:包括的ガイド
- Java配列チュートリアル:宣言、生成、初期化の完全ガイド