C# の 配列型
C# の配列とは
配列 (array) は同じ型のデータが順番に並ぶデータ構造です。配列内の要素数は固定です。配列内の要素にはインデックスでアクセスできます。
例えば、長さが 4 である char 型の配列 a は char[] a = new char[4] として作成します。配列 a の 1 番目の要素には a[0]、 2 番目の要素には a[1] というように [] にインデックスを指定することでアクセスできます。
static void Main(string[] args)
{
char[] a = new char[4];
a[0] = 'A';
a[1] = 'B';
a[2] = 'C';
a[3] = 'D';
Console.WriteLine(a[2]); // C
}
new char[4] のときの 4 という数字は、配列のサイズ (要素の数) です。 インデックスは 0 から始まるので、サイズが 4 のとき使えるインデックスは 0 から 3 までの 4 個です。
その他、後述するように多次元の配列なども作ることもできます。
C# の配列の初期化
配列を作成するときに、初期値を指定して作成することもできます。
次の例 (7行目) では配列の宣言と同時に、初期値 'A'、 'B'、 'C'、 'D' をセットしています。
using System;
class Program
{
static void Main(string[] args)
{
char[] a = new char[] { 'A', 'B', 'C', 'D' };
Console.WriteLine(a[2]); // C
}
}
また、初期化時に new char[] を省略して、次のように書くこともできます。
char[] a = { 'A', 'B', 'C', 'D' };
C# の配列の長さ
C# の配列の長さは、 Length プロパティとして取得できます。
char[] a = new char[4];
Console.WriteLine(a.Length); // 4
C# の配列と foreach
foreach 文を使って、配列要素を順番に取得することができます。
char[] a = { 'A', 'B', 'C', 'D' };
foreach (char c in a)
{
Console.WriteLine(c);
}
C# の配列と forEach() と Action
Array クラスの ForEach メソッドと Action<T> を組み合わせることで、配列内の要素を受け取り処理するメソッドを指定して呼び出すことができます。
char[] a = { 'A', 'B', 'C', 'D' };
Action<char> printAction = new Action<char>(Print);
Array.ForEach(a, printAction);
static void Print(char ch)
{
Console.WriteLine(ch);
}
C# の配列と Index
配列のインデックスは、先頭の要素を 0 番目として (Length - 1) 番目まで使えます。
配列内の最後尾の要素からのインデックスを指定することもできます。
インデックス ^1 は配列内の最後の要素を示します。最後から二番目は ^2 です。
char[] a = { 'A', 'B', 'C', 'D' };
Console.WriteLine(a[^1]); // D
通常のインデックスは整数型でアクセスできますが、配列内の最後尾要素からのインデックスを指定するには Index 型を使います。
char[] a = { 'A', 'B', 'C', 'D' };
Index i = ^3;
Console.WriteLine(a[i]); // B
Index 型はリテラルで値を指定する以外にも、次のように変数で値を渡すことができます。
char[] a = { 'A', 'B', 'C', 'D' };
int m = 3;
Index i = ^m;
Console.WriteLine(a[i]); // B
C# の配列と Range
配列のインデックスの範囲は .. で指定できます。
次の例では foreach でインデックスの範囲を a[2..4] としています。 この場合、 インデックス2 が開始インデックスで 4 が終了インデックスです。終了インデックスが示す要素は範囲に含まれません。
char[] a = { 'A', 'B', 'C', 'D', 'E', 'F' };
foreach (char c in a[2..4])
{
Console.Write(c);
}
// CD
先頭要素から範囲を指定する場合は、開始インデックスを省略して ..2 のように書くこともできます。同様に最後尾要素までの範囲であれば、終了インデックスを省略して 3.. のように書くこともできます。
動的に範囲を設定するには、インデックス範囲を表す Range 型を使って範囲を指定できます。
char[] a = { 'A', 'B', 'C', 'D', 'E', 'F' };
Range range = 2..5;
foreach (char c in a[range])
{
Console.Write(c);
}
// CDE
また Index 型を利用して、末尾からのインデックスを指定することができます。
char[] a = { 'A', 'B', 'C', 'D', 'E', 'F' };
foreach (char c in a[^3..^1])
{
Console.Write(c);
}
// DE
Range 型と Index 型を組み合わせることもできます。
Index first = ^3;
Index last = ^1;
Range range = first..last;
// range = [^3..^1]