C# 配列の仕組みと使い方のサンプル

C#の配列の仕組みと使い方のサンプルです。

仕組み 配列とは
作成 初期値ありで作成 / 要素の数を宣言して作成 / 配列の値を表示
取得 foreach文,for文で要素を取得 / 要素を検索(ContainsとIndexOfの違い)
  要素数を取得(Length)
追加/変更 要素を追加 / 配列の値を変更(添字) / 配列の値をクリア
ソート/コピー 要素をソート / 配列をコピー
変換 配列をリストに変換 / リストを配列に変換
使用 メソッドの引数と戻り値が配列

配列とは

var a = new[] {値1,値2,値3};

上記は複数の値を変数aに代入しています。
この変数aは配列として複数の値を持ちます。

  • 1つの変数で同じ型の複数の値を保持できます。
  • 各項目を要素(element)といいます。
  • 要素の位置をインデックス(添字)で管理します。上記図では[0]、[1]、[2]、[3]です。
  • インデックスは0から始まります。
  • 以下は、MicrosoftのC# プログラミング ガイドの配列のリンクです。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/

初期値ありで作成

配列の宣言と同時に初期値を設定するサンプルです。

  string[] arr1 = { "赤", "黄", "青" };
  Console.WriteLine(arr1[0]);//赤
  Console.WriteLine(arr1[1]);//黄
  Console.WriteLine(arr1[2]);//青

  var arr2 = new string[] { "緑", "紫", "茶" };
  Console.WriteLine(arr2[0]);//緑
  Console.WriteLine(arr2[1]);//紫
  Console.WriteLine(arr2[2]);//茶

  var arr3 = new[] { "白", "黒", "灰" };
  Console.WriteLine(arr3[0]);//白
  Console.WriteLine(arr3[1]);//黒
  Console.WriteLine(arr3[2]);//灰

  byte[] b1 = { 0, 5, 255 };
  sbyte[] b2 = { -128, 5, 127 };

1行目は、配列の宣言時に配列の値を設定します。
6行目は、1行目と比べて型名のstring[ ]の記述がありません。代わりにvarを使用しています。
11行目もvarを使用しています。型の指定をしていませんが右辺の値から自動的に決まります。型推論です。
16,17行目はバイト配列です。
byteは0から255までで、sbyteは-128から127までです。

要素の数を宣言して作成

配列の要素の数を宣言し後から値を代入するサンプルです。

  string[] arr1 = new string[3];
  arr1[0] = "赤";
  arr1[1] = "黄";
  arr1[2] = "青";
  //arr1[3] = "オレンジ"; //インデックスが配列の境界外ですのエラー
  
  Console.WriteLine(arr1[0]);//赤
  Console.WriteLine(arr1[1]);//黄
  Console.WriteLine(arr1[2]);//青

1行目は、配列の要素数を3としています。
そのため5行目のように4つめの値を代入できません。
添字は0から始まります。

配列の値を表示

  var arr1 = new[] { "赤", "黄", "青" }; //配列

  Console.WriteLine(arr1);//System.String[]

  Console.WriteLine(string.Join(",", arr1));//赤,黄,青

3行目のように配列の変数を指定してもSystem.String[]と表示され値が表示されません。
5行目は、Joinメソッドで配列の値をカンマ区切りで結合して表示しています。

foreach文,for文で要素を取得

配列の各値を順に取得します。

  var arr1 = new[] { "赤", "黄", "青" }; //配列
  
  // foreach文
  foreach (var str1 in arr1)
  {
      Console.WriteLine(str1);// 赤 黄 青
  }
  
  // for文
  for (var i = 0; i < arr1.Length; i++)
  {
      Console.WriteLine(arr1[i]);// 赤 黄 青
  }

 

要素を検索(ContainsとIndexOfの違い)

public bool Contains (string value);
public static int IndexOf (Array array, object value);

Containsメソッドは、指定の値が存在する場合はTrueを、存在しない場合はFalseを返します。
IndexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。

  var arr1 = new[] { "赤", "黄", "青" }; //配列
  
  // Contains
  bool b1 = arr1.Contains("黄");
  Console.WriteLine(b1); // Trueが出力される
  bool b2 = arr1.Contains("白");
  Console.WriteLine(b2); // Falseが出力される
  
  // IndexOf
  int b3 = Array.IndexOf(arr1, "青");
  Console.WriteLine(b3); // 2が出力される
  int b4 = Array.IndexOf(arr1, "白");
  Console.WriteLine(b4); // -1が出力される

配列の位置は0から始まります。赤=0,黄=1,青=2。

要素数を取得(Length)

  var arr1 = new[] { "赤", "黄", "青" }; //配列
  Console.WriteLine(arr1.Length);// 3

  Console.WriteLine(arr1[arr1.Length-1]);// 青

Lengthで配列の要素数を取得できます。
4行目は、Lengthを使用して最後の要素を取得しています。

要素を追加

  var arr1 = new[] { "赤", "黄", "青" }; //配列

  Array.Resize(ref arr1, 4);

  arr1[3] = "オレンジ";
  foreach (var str1 in arr1)
  {
      Console.WriteLine(str1);// 赤 黄 青 オレンジ
  }

3行目は、Array.Resizeで配列の要素の数を増やしています。
ひとつめの引数のrefは、無いとエラーになります。
5行目は追加された配列の要素へ値をセットしています。

配列の値を変更(添字)

  var arr1 = new[] { "赤", "黄", "青" }; //配列

  arr1[1] = "オレンジ";

  Console.WriteLine(arr1[0]);// 赤
  Console.WriteLine(arr1[1]);// オレンジ
  Console.WriteLine(arr1[2]);// 青

値の変更はインデックス(添字)で要素を指定します。

配列の値をクリア

public static void Clear(Array array, int index, int length);

Clearメソッドは値をクリアします。

  // 配列を作成
  var arr1 = new[] { "赤", "黄", "青" };
  
  // クリア
  Array.Clear(arr1, 0, arr1.Length);
  
  // 枠自体はあるが中身なし
  Console.WriteLine(arr1.Length);//3
  Console.WriteLine(arr1[0]);//
  Console.WriteLine(arr1[1]);//
  Console.WriteLine(arr1[2]);//

要素をソート

  var arr1 = new[] { 100, 2, 99 }; //配列
  Array.Sort(arr1);
  Console.WriteLine(arr1[0]); //2
  Console.WriteLine(arr1[1]); //99
  Console.WriteLine(arr1[2]); //100

  var arr2 = new[] { "da", "abb", "pccc" }; //配列
  Array.Sort(arr2);
  Console.WriteLine(arr2[0]); //abb
  Console.WriteLine(arr2[1]); //da
  Console.WriteLine(arr2[2]); //pccc

1行目は、数値の配列です。
結果は、2,99,100になります。100,2,99にはなりません。
7行目は、文字列の配列です。
結果は、先頭の文字のabc順に表示されます。

配列をコピー

Array.Copy(コピー元配列,開始位置,コピー先配列,開始位置,コピーする要素数)

ArrayクラスのCopyメソッドでコピーします。

  var arr1 = new[] { "赤", "黄", "青" }; //配列
  var arr2 = new string[arr1.Length];  //配列

  Array.Copy(arr1, 0, arr2, 0, arr1.Length);

  arr2[1] = "オレンジ";

  foreach (var str1 in arr1)
  {
      Console.WriteLine(str1);// 赤 黄 青が出力される
  }
  foreach (var str1 in arr2)
  {
      Console.WriteLine(str1);// 赤 オレンジ 青が出力される
  }

1行目はコピー元の配列で、2行目はコピー先の配列です。
4行目は、ArrayクラスのCopyメソッドで配列をコピーしています。
6行目は、コピー先の配列の値を変更しています。
コピー先の値は変わりましたが、コピー元の値は変更されていません。

配列をリストに変換

  var arr1 = new[] { "赤", "黄", "青" }; //配列

  List<string> list1 = new List<string>(arr1);

  list1.Add("オレンジ");
  foreach (var str1 in list1)
  {
      Console.WriteLine(str1);// 赤 黄 青 オレンジ
  }

配列からリストの変換は、リストのコンストラクタに配列を指定します。

リストを配列に変換

public T[] ToArray();

ToArrayメソッドは、リストを配列に変換します。

  var list1 = new List<string>() { "赤", "黄", "青" };//リスト

  string[] arr1 = list1.ToArray();
  foreach (var str1 in arr1)
  {
      Console.WriteLine(str1);// 赤 黄 青
  }

 

メソッドの引数と戻り値が配列

  var arr1 = new[] { "赤", "黄", "青" }; //配列

  string[] arr2 = GetColor(arr1);

  private static string[] GetColor(string[] a1)
  {
      return a1;
  }

3行目は、呼び出し元のメソッドです。引数と戻り値が配列です。
5行目は、定義されたメソッドです。引数と戻り値が配列です。

関連の記事

C# 2次元配列のサンプル

△上に戻る