配列とリストは共に連続したデータを一元管理するためのものですが、プログラム初心者にとってイマイチ違いが分かりずらいという声を耳にします。
今回は、両者の違いを明確にして、それぞれに対して効果的な使い方のサンプルを紹介し、理解を深めて頂こうと思います。
そもそも配列とは?
配列は連続した値を保持し、添え字を使って値の登録・変更を行うためのデータ構造です。
宣言した要素数を格納するのに必要な領域を、まとめてメモリ上に確保します。
1次元配列(添え字が1つ)、2次元配列(添え字が2つ=表形式)、多次元配列(添え字が3つ以上)を作ることが出来ます。
実際のプログラミングにおいては1次元配列が最も良く使われ、たまに2次元配列が使われる程度です。
多次元配列は使う側がイメージしづらいため、数学の行列演算くらいにしか使われません。
そもそもリストとは?
1次元配列とよく似ていますが、宣言時に空の変数が作成され、随時必要に応じて要素を追加していきます。
要素同士がチェーンで繋がっているようなイメージなので、途中でチェーンを切ったり繋ぎ変えることで、要素の挿入や削除が可能です。
配列とリストの明確な違いは?
配列は宣言時に必要なメモリを確保してしまうため、個々の要素を減らしたり追加することが出来ません。
その代わり、2次元配列や3次元配列などを作ることが可能です。
リストは1次元しか作れませんが、動的に要素を追加・変更・削除・挿入することができます。
配列と要素の使い分けは?
最初にデータを格納する領域をメモリに確保しているため、値の読み書きに関する処理速度はリストに比べて高速です。
また、構造が単純なためメモリー効率にも優れています。
個数が決まっている場合は迷わず配列を使いましょう。
一方、リストは1次元しか扱えませんが、後から好きなだけ要素を追加可能で、挿入、変更、削除が行えるという特徴があります。
処理してみないと個数が分からないような場合は、リストの出番となります。
になみに、処理速度は配列に比べて劣るとは言いましたが、よほど大量のデータをミリ秒単位で節約するような特殊な場合を除き、通常は無視できるくらいの差しかありません。
1次元配列なら、リストとの相互変換は簡単
1次元配列であれば、配列からリストへ、またはリストから配列へ簡単に変換できます。
変換する際、簡単な記述で指定した条件を抜き出して変換することも可能です。
たとえば、配列をリストに変換する場合、ToArray()メソッドを使います。
1 2 3 4 5 |
//配列の宣言 int[] arrayData = new int[]{100,200,300,400}; //配列からリストへの変換 List<int> listData= arrayData.ToArray(); |
逆に、リストから配列に変換する場合、ToList()メソッドを使います。
1 2 3 4 5 |
//リストの宣言 List<int> listData = new List<int>(){100,200,300,400}; //リストから配列への変換 int[] arrayData= listData.ToList(); |
特定の条件を抜き出したい場合はLinqを使います。
以下は配列の例です。
1 2 3 4 5 |
//配列の宣言 int[] arrayData = new int[]{100,200,300,400}; //値が200以上300以下のデータのみ抜き出した配列を作成する int[] result = arrayData.Where(i=>200 <= i && i<= 300).ToArray(); |
リストでも全く同じ方法で抜き出すことが出来ます。
1 2 3 4 5 |
//配列の宣言 List<int> listData = new List<int>(){100,200,300,400}; //値が200以上300以下のデータのみ抜き出したリストを作成する List<int> result = listData .Where(i=>200 <= i && i<= 300).ToList(); |
末尾の ToList() をToArray() に替えることで、抜き出した結果を配列にすることも可能です。
1 2 3 4 5 |
//配列の宣言 List<int> listData = new List<int>(){100,200,300,400}; //値が200以上300以下のデータのみ抜き出して配列にする int[] result = listData .Where(i=>200 <= i && i<= 300).ToArray(); |
配列の使用例
配列を使ったサンプルソースです。
例えば入力された値が、決められた候補の中に存在するかとかに使うことが多いです。
1 2 3 4 5 6 7 |
private string[] week = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; private string Check(string key) { return (week.Contains(key)) ? "OK": "ERR"; } |
しかし、たぶん一番多いのは関数(メソッド)の戻り値として返す時だと思います。
1 2 3 4 5 |
private string[] GetFile(string filename) { string data = File.ReadAllText(filename); return data.Split('\t'); } |
リストの使用例
リストを使ったサンプルソースです。
ファイルを読み込むとか、読み込んだ値から有効なデータを取り出すような場合はリストを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private string[] GetFile(string filename) { string[] lines = File.ReadAllLines(filename); List<string> result = new List<string>(); foreach(string line in lines) { if(line.StartsWith("住所") == true) { result.Add(line); } } return line.ToArray(); } |
まとめ
配列とリストの違いは
- 配列は宣言時に個数を決めると後から変更できないが、2次元配列以上の配列が作成できる。
- リストは1次元しか扱えないが、後から個数を増やしたり減らしたりできる。
ということでした。
なので、個数が分かっている場合は配列を、個数が分かっていない場合はリストを使います。
両方ともよく使うデータ構造なので、しっかりポイントを押さえておきましょう。