C#でプログラムを作成する際に、データを複数扱う方法として「配列(Array
)」と「リスト(List<T>
)」があります。どちらも複数のデータを管理できますが、それぞれの特性や使い方には大きな違いがあります。
「配列とリスト、どちらを使えばいいのか?」
この疑問に答えるため、本記事では配列とリストの基本的な特徴を解説し、両者の違いや使い分けのポイントを紹介します。C#での適切なデータ管理の参考にしてください!
配列とリストの違い
配列(Array
)とリスト(List<T>
)には、それぞれ異なる特徴があります。主な違いを比較表で整理してみましょう。
項目 | 配列(Array) | リスト(List<T>) |
---|---|---|
サイズ変更 | 不可(固定長) | 可能(可変長) |
メモリ管理 | 事前に確保されたメモリを使用 | 必要に応じてメモリを確保・拡張 |
要素の追加・削除 | 不可(新しい配列を作成する必要あり) | 簡単に追加・削除できる |
アクセス速度 | 高速(配列のインデックスを直接参照) | 配列とほぼ同じだが、内部処理が加わるため若干遅い |
使いやすさ | シンプルだが柔軟性が低い | 機能が豊富で柔軟にデータを管理できる |
用途 | 固定長のデータ管理、高速アクセスが必要な場合 | 要素の増減がある場合や、データ操作が多い場合 |
詳しく解説していきます。
サイズ変更の可否
配列は固定長のため、一度作成するとサイズを変更できません。要素を増やしたい場合は、新しい配列を作成し、元のデータをコピーする必要があります。
一方、リストは可変長であり、必要に応じてサイズが自動で拡張されるため、要素の追加・削除が容易です。
// 配列のサイズは変更できない
int[] array = new int[3] {1, 2, 3};
// array[3] = 4; // コンパイルエラー!
// リストなら追加可能
List<int> list = new List<int>() {1, 2, 3};
list.Add(4); // OK
メモリ管理
配列は、作成時に固定サイズのメモリを確保するため、不要なメモリ確保を防げます。一方、リストは内部的に動的なメモリ管理を行い、要素の増減に応じてメモリを確保・解放します。そのため、リストの拡張時には、既存データを新しいメモリ領域にコピーする処理が発生することがあります。
要素の追加・削除
配列は要素の追加・削除ができず、新しい配列を作成してデータを移行する必要があります。一方、リストはAdd()
やRemove()
メソッドを使って簡単に要素を追加・削除できます。
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };
names.Add("David"); // 要素の追加
names.Remove("Bob"); // 要素の削除
パフォーマンス
配列はインデックスアクセスが高速で、メモリ効率も良いため、大量のデータを扱う場合に適しています。
リストは内部で配列を使用しているためアクセス速度はほぼ同じですが、サイズ変更時に内部配列のコピーが発生するため、頻繁に要素を追加・削除する場合はオーバーヘッドが発生することがあります。
まとめ
- 配列はサイズが固定で高速アクセスが可能。メモリ効率を重視する場合に適している。
- リストはサイズ変更が自由で、要素の追加・削除が簡単。柔軟なデータ操作が必要な場合に適している。
リストと配列の適切な使い分け
配列(Array
)とリスト(List
)は、それぞれ異なる特徴を持つため、用途に応じた適切な使い分けが重要です。以下に、選択の目安となるポイントを紹介します。
要素数が決まっている場合
データの要素数があらかじめ決まっているか、それとも変動する可能性があるかによって、配列(Array
)とリスト(List<T>
)のどちらを選ぶべきかが変わります。
要素数が固定の場合 → 配列(Array)が適切
配列は、作成時にサイズを指定するため、要素数が事前に決まっているデータを管理するのに適しています。
例
- 曜日の一覧(
{"月", "火", "水", "木", "金", "土", "日"}
) - 4つの方向キーの設定(
{"Up", "Down", "Left", "Right"}
) - 特定の数のセンサー値を格納する(例:温度データ100件を保存)
// 7日間の曜日データを格納する配列(サイズは固定)
string[] weekdays = { "月", "火", "水", "木", "金", "土", "日" };
要素数が変動する場合 → リスト(List)が適切
リストは動的に要素を追加・削除できるため、データの数が実行時に変わる可能性がある場合に適しています。
例
- ショッピングカートの商品一覧(ユーザーによって異なる)
- Webアプリのユーザーリスト(登録・退会により変動)
- ゲームのスコア履歴(試合ごとにデータが増減)
// ユーザーのリスト(サイズが動的に変化)
List<string> users = new List<string>();
users.Add("Alice");
users.Add("Bob");
users.Remove("Alice"); // ユーザーを削除
要素の追加・削除を頻繁に行うか?
データの追加や削除を頻繁に行うかどうかは、配列(Array
)とリスト(List<T>
)を選択する上で重要なポイントです。
追加・削除が不要な場合 → 配列(Array)が適切
配列は、サイズが固定されており、要素の追加や削除ができません。したがって、データの数が変わらず、途中で変更する必要がない場合に適しています。
例
- 1週間分の固定データを扱う(例:曜日のリスト)
- 事前に決められた設定項目(例:ゲームのキー設定)
- 変更不要なID一覧
// 4つの方向キーを格納する配列(変更しない)
string[] directions = { "Up", "Down", "Left", "Right" };
追加・削除を頻繁に行う場合 → リスト(List)が適切
リストは、要素を自由に追加・削除できるため、データの数が変動する場合に適しています。
例
- ショッピングカートの中身(商品を追加・削除)
- Webアプリのユーザー一覧(登録・退会によって変動)
- ゲームのスコア履歴(試合ごとに増減)
// ユーザーリストを管理(追加・削除可能)
List<string> users = new List<string>();
users.Add("Alice"); // ユーザーを追加
users.Add("Bob");
users.Remove("Alice"); // ユーザーを削除
まとめ
配列(Array
)とリスト(List
)は、それぞれ異なる特性を持っており、用途に応じた適切な選択が重要です。
適切なデータ構造を選択することで、コードの可読性を向上させ、パフォーマンスを最適化できます。用途に応じて、配列とリストを使い分けましょう!
コメント