トップC# > 配列の操作

配列の操作

一次元配列

一次元配列の宣言および初期値付き宣言の例を以下に示す[1]。

  int[] array1 = new int[5];             // 5 個の整数値を含む 1 次元配列. 初期値 0
  int[] array2 = new int[] { 1, 3, 5, 7, 9 };
  int[] array3 = { 1, 3, 5, 7, 9 };
  string[] stringArray = new string[6];  // 6 個の文字列を含む 1 次元配列
  string[] weekDays1 = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

多次元配列

多次元配列の宣言および初期値付き宣言の例を以下に示す[2]。

  int[,] array = new int[4, 2];    // 4行2列
  int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
  string[,] array2Db = new string[3, 2] { {"one", "two"}, {"three", "four"}, {"five", "six"} };
  int[,] array2D = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
  string[,] array2Db = { {"one", "two"}, {"three", "four"}, {"five", "six"} };

多次元配列の参照は array2D[3,0]、array2D[1,1] のように表記する。

配列の長さ

C#では一次元配列の長さは 配列(変数)名.Length で長さを取得できる。

多次元配列の場合、配列(変数)名.Length で得られるのは全要素数である。 各次元の配列数を求める場合は 配列(変数)名.GetLength(次元数) とする。

例えば、 int[,] array = new int[4, 2]; の場合、array.GetLength(0), array.GetLength(1) が それぞれ 4, 2 である。

配列の配列

C言語では

  int data[3][5];
  data[2][3] = 123;
と書くものが、C# では
  int[,] data = new int[3,5];
  data[2,3] = 123;
となることは上で述べた。しかし、C# でも data[2][3] という表現がないわけではない。 つぎのように、配列の要素が配列であるとき、このような表現となる。
  int[][] data = new int[3][];
  data[0] = new int[5];
  data[1] = new int[5];
  data[2] = new int[5];
  data[2][3] = 123;

C言語でも配列の配列が存在する。 上のように、配列の配列を宣言しても、int data[3][5] のような配列(メモリ上では一次元配列)でも 要素の参照 data[2][3] は同じ表現となる。 C#では、両者が区別されるので、分かりやすいと言えるかも知れない。

部分配列

別の配列に、配列中のある範囲内の要素をコピーするには、Array.Copyメソッドを使用する。

public static void Copy(
	Array sourceArray,		// コピー元配列
	int sourceIndex,		// コピー元配列の先頭位置
	Array destinationArray,		// コピー先配列
	int destinationIndex,		// コピー先配列の先頭位置
	int length			// コピーする要素数
)

配列の検索(探索)

配列の要素にあるものが含まれているかどうかを調べるには Array.IndexOf メソッドを使うのが楽である。 下に例を示す。最初にみつかった位置(インデックス)が返される。見つからなかったときは、-1 が返される。

using System;

class Test {
    static void Main() {
        string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
        Console.WriteLine("Array.IndexOf(weekDays, \"Wed\") = " + Array.IndexOf(weekDays, "Wed"));
        Console.WriteLine("Array.IndexOf(weekDays, \"fri\") = " + Array.IndexOf(weekDays, "fri"));
    }
}

このプログラムの実行結果を下に示す。

Array.IndexOf(weekDays, "Wed") = 3
Array.IndexOf(weekDays, "fri") = -1

先頭からではなく、途中から探すときは public static int IndexOf(Array array, Object value, int startIndex) を使う。

また、先頭からではなく、末尾から探す(最後に見つかったものを返す)には Array.LastIndexOfメソッドを使用する。

リファレンス

[1] 1 次元配列 (C# プログラミング ガイド)[msdn]
[2] 多次元配列 (C# プログラミング ガイド)[msdn]
[3] Array.Copy メソッド (Array, Int32, Array, Int32, Int32)[msdn]
[4] Array.IndexOf メソッド [msdn]
[5] Array.LastIndexOf メソッド [msdn]