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行目は、定義されたメソッドです。引数と戻り値が配列です。
関連の記事