プログラミングを初めて学ぶ時、色々と覚える事が多くて大変ですよね。そこで、今回は、覚えずとも必要になったときに見直してもらえるように、C#の「配列」についての基礎をご紹介したいと思います。(ぜひ、ブックマークして必要な時に見直してください)
INDEX
C#の配列とは?
配列の意味は、プログラミング言語によって、若干意味合いが違ってきますが、C# においては、配列とは、「複数のデータを格納・取り出しができるもの、複数のデータの集合」と考えると良いでしょう。
例えば、社員30人の年齢をプログラミングで扱うケースを考えてみます。この場合、配列を使用しないと、int で30個の変数を宣言する必要があります。配列を使用すれば、1つの配列を宣言するだけで、そこに30人分の年齢を格納することできます。
ただ、上記の説明だけでは、イメージしにくいと思います。
そこで、以下の章から早速コードを使って順に説明していきます。
\21万以上のオンラインコースから選べる!/
Udemyで講座を探すC#で配列の宣言を行う方法
C# において配列は、宣言しないと使えません。
そして宣言は、格納できる要素の型を使って表現されています。
例えば、 int型のデータを格納する配列を作成するならば、
1 |
int[] array1 = new int[10]; // 配列の宣言 |
と宣言します。
これで、int型の要素を10個格納できる配列 array1 が使えるようになります。
同様に
1 |
double[] array2 = new double[3]; // double型の配列の宣言 |
1 |
object[] array3 = new object[5]; // object型の配列の宣言 |
と書くと double型の要素3個格納できる array2 や object型の要素5個格納できる array3 ができます。
配列の要素に代入
配列の宣言の方法が分かったら、次は配列の使い方です。
宣言した後に配列にデータを入力したり、配列の要素を使ったりしてみたいと思います。
以下は、配列の要素に整数を入れています。
1 2 3 4 |
int[] array4 = new int[3]; array4[0] = 3; array4[1] = 5; array4[2] = 7; |
上記のように配列を表す変数の後に “[添字]” としたものに代入する形で、配列にデータが格納できます。
データの格納ができたなら、次は配列の要素の使い方です。
要素を取り出すには、格納したときの添字の使い方と一緒です。
1 2 3 |
int[] array5 = new int[2]; array5[1] = 3; int data = array5[1]; // 変数data には 3が格納される |
これで、変数data に array5の2番目の要素である「3」が格納されます。
C#で配列の初期化をする方法
C#で配列の宣言、格納や取り出しが分かったら、次は配列を使って色々プログラミングをしていくことになるのですが、int型の配列などを使っていると、最初にいろいろな値で初期化しておきたい!と思うことがあります。
そんな時は以下のように、配列を宣言し、配列の要素に値を代入していくと良いでしょう。
1 2 3 4 |
int[] array6 = new int[3]; array6[0] = 1; array6[1] = 3; array6[2] = 5; |
上記のように書いてもいいですが、初期化専用の書き方もあります。
1 |
int[] array7 = new int[3] { 1, 3, 5 }; // array6 と同じ結果になる |
また、代入される要素とその要素数が決まっているので、省略でき、
1 |
int[] array8 = new int[] { 1, 3, 5 }; // array6,array7 と同じ結果になる |
と要素数3 を省略して書いても大丈夫です。
さらには、new int[] も省略できます。
1 |
int[] array9 = { 1, 3, 5 }; // array6,array7,array8 と同じ結果になる |
コード9が短い初期化方法でしょう。
それぞれすべて同じ内容を指しています。どれを使ってもいいので、分かりやすさや好みで、使う記述方法を決めてください。
C#の配列の要素数を取得する方法
C#の配列の要素を取得する方法は、いろいろありますが、配列は、データの集合でもあるので、C#において配列はクラスで表現されています。
配列は、Array クラスを基底クラスとして継承しています。継承することで、Arrayクラスのプロパティ(データの情報)及び、メソッド(操作を定義したもの)を使用することができます。
例えば、Arrayクラスには下記のプロパティやメソッドがあります。
- プロパティ
Length:配列の全ての要素数
Rank:配列の次元
- メソッド
Sort:配列を小さい順に並べる
Reverse:配列を大きい順に並べる
Clear:配列を0で初期化する
Arry クラスの説明は以下のマイクロソフトのドキュメントで調べていただくのがいいでしょう。
https://msdn.microsoft.com/ja-jp/library/system.array.aspx
今回は、要素数を調べるので、Array.Length を使います。
Array.Lengthは全ての要素数を返す、プロパティです。for文で配列を処理するときの最大値にも使用できます。
https://msdn.microsoft.com/ja-jp/library/system.array.length.aspx
1 2 |
int[] array10 = new int[100]; int n = array10.Length; // 100 |
Length プロパティは、配列の要素の総数を出力します。
ここでは、int型の要素数100の配列を宣言していますので、n には 100が入ります。
C#配列の要素を、繰り返し構文(foreach文・for文) を使って処理する方法
配列の要素一つ一つに対して処理をしていきたいという時は、foreach/for 文を使っていきます。
1 2 3 4 5 |
int[] array11 = { 1, 2, 3, 4, 5, 6 }; foreach (int element in array11) { System.Console.WriteLine(element); } |
上記コードは配列 array11 の一つ一つが element として参照され System.Console.WriteLine() でコンソールに出力しています。
for文もありますが、配列を繰り返し処理するという部分においてメリットはありません。
初心者はforeach を積極的に使っていくと良いと思います。
一応、for文で同じ事をした時のものも記載しておきます。
1 2 3 4 5 |
int[] array12 = { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < array12.Length; i++) { System.Console.WriteLine(array12[i]); } |
for のカッコの中で 変数i を宣言して、それを利用している方法です 。C言語から流用された文法だということが想像できますね。
C#配列のソートについて
最後にC#配列のソートについてお話しましょう。
配列のソートについては、Array.Sort を使います。
1 2 3 4 5 6 7 |
int[] array13 = { 8, 5, 6, 11, 0, 2 }; Array.Sort(array13); // { 0, 2, 5, 6, 8, 11 } に変わっている foreach (int element in array13) { System.Console.WriteLine(element); } System.Console.ReadKey(); |
配列array13 を Array.Sort に引数として渡してあげるだけです。
すると、array13の中のデータがソートされます。
なお、「引数」とは、関数に渡す値のことです。
関数は何かを入力すると、何かを計算して、何かを出力してくれる機能をまとめたものです。機能を関数としてまとめておくことで、引数として値を関数に渡すだけ、結果を得ることができるようになります。
文字列の場合はどうでしょうか?
以下のように文字列の配列も Array.Sort を使ってソートできます。
コード14
1 2 3 4 5 6 |
string[] array14 = { "Zulu", "India", "Bravo", "Foxtrot", "シーシャープ", "Alfa" }; Array.Sort(array14); // { "Alfa","Bravo","Foxtrot","India","Zulu","シーシャープ" } に変わっている foreach (string element in array14) { System.Console.WriteLine(element); } |
なお、ソートしたい場合は、配列に格納する方法だけでなく、Listクラスを使用してソートする方法もあります。
Array.Sort以外のソート方法
Array.Sort以外のソート方法をいくつか紹介します。
・List.Sortでのソート
Array型は要素の数が決まったデータに使う一方、List型は要素の数がプログラム実行中に決まっていく可変長のデータに使われます。
サンプルコードのようにSortメソッドを用いることで、要素を昇順に並べることができます。Sortメソッドの引数には何も設定していません。
コード15
1 2 3 4 5 6 |
int[] src = {3, 1, 5, 4, 2}; var list = new List<int>(); list.AddRange(src); // listにAddRangeメソッドを使って、要素を追加 list.Sort(); // listをソート Console.WriteLine("[{0}]", string.Join(", ", list)); Console.ReadKey(); |
・ラムダ式でのソート
Sortの引数にラムダ式を指定することで、ソートの条件を変更することができます。
ラムダ式とは、関数を変数のように扱えるようにするものです。例えば、下記のサンプルコードのように、Sortメソッドの引数に、「(a, b) => b – a」を設定することで、降順に並べることが可能です。
コード16
1 2 3 |
List<int> list = new List<int>() { 3, 1, 5, 4, 2 }; list.Sort((a, b) => b - a); Console.WriteLine("{0}", string.Join(", ", list)); |
・OrderByメソッドでのソート
データの操作を拡張するLINQを使用して、ソートすることも可能です。LINQを使用するためには、コードの先頭に「using System.Linq;」を追加する必要があります。
その上でソートを行うためには、OrderByメソッドを使用します。OrderByメソッドの引数には、比較方法を指定しますが、ラムダ式を使用するのが一般的です
コード16
1 2 3 4 |
int[] src = {3, 1, 5, 4, 2}; var dst = src.OrderBy(a => a); // LINQのOrderByメソッドでソート Console.WriteLine("[{0}]", string.Join(", ", dst)); Console.ReadKey(); |
このサンプルコードでは、昇順にソートします。
LINQでは複雑な並び替えも実現できます。例えば、血液型でソートするが、血液型が同じ場合は年齢順でソートする、というような処理を、OrderByに続けて、ThenByメソッドを使用することでソートが可能です。
おわりに – 今後の学習の仕方
ここまで、C#の配列の基本的なことから、配列ではよく使うソート方法についても、様々な例を挙げて紹介しました。
この記事を読み終わったあなたなら、配列をこうしたいけどどうしよう、と思うこともでてくるでしょう。
そんな時は C# プログラミングガイドというマイクロソフトのWebサイトのページを見ると色々載っているので参考になるかもしれません。
より高度な事を学びたいという方は、ぜひ本やオンライン動画などで学習していきましょう!
では、プログラミングをこれからも楽しんでください!
最新情報・キャンペーン情報発信中