今回は、C#のListの使い方についてご紹介します。
Listとは
List<T> は、配列のように同じ型のデータを連続して管理しながらも、要素数を動的に増減できるコレクションです。
配列では宣言時に要素数を決める必要がありますが、List は追加や削除によって必要に応じて容量を自動的に拡張・縮小できます。
主な特徴は以下のとおりです。
- 動的なサイズ変更:要素を追加・削除するたびに内部的に再確保が行われる
- 型安全性:ジェネリック型であり、指定した型以外の要素は格納できない
- 豊富な操作メソッド:要素の検索、並び替え、変換など便利なメソッドが用意されている
ここでは、List の作成から要素の追加・削除、検索、ソート、そして実用的な使い方まで幅広く解説します。
基本的な使い方
List の作成と初期化
List の作成は、new List<T>() で行います。
また、コレクション初期化子を使うと、宣言と同時に初期値を設定できます。
1 2 3 4 5 |
// 空の整数リストを作成 List<int> numbers = new List<int>(); // コレクション初期化子を使った作成 List<string> names = new List<string> { "太郎", "花子", "次郎" }; |
(このコードでは実行時に特別な出力はありません)
要素の追加
要素を追加する方法として、Add や Insert があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 整数リストに値を追加 numbers.Add(10); numbers.Add(20); numbers.Add(30); // Insertで特定の位置に挿入 numbers.Insert(1, 15); // 結果: 10, 15, 20, 30 // リストの中身をコンソールに出力する例 foreach (int num in numbers) { Console.WriteLine(num); } |
10
15
20
30
要素の削除
Remove や RemoveAt、Clear を利用して、必要に応じた削除が行えます。
1 2 3 4 5 6 7 8 9 10 |
// 値20を削除(最初に見つかったものが削除される) numbers.Remove(20); // 結果: 10, 15, 30 // インデックス0の要素を削除(10を削除) numbers.RemoveAt(0); // 結果: 15, 30 // リストを空にする numbers.Clear(); // 結果: 空のリスト Console.WriteLine("Count: " + numbers.Count); |
Count: 0
要素へのアクセスとループ処理
インデックスを使ったアクセスや、Count プロパティによる要素数の取得、foreach や for ループでの処理が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// リストを初期化 List<string> fruits = new List<string> { "りんご", "みかん", "ぶどう" }; // インデックスによるアクセス Console.WriteLine(fruits[0]); // りんご // 要素数の確認 Console.WriteLine("果物の数: " + fruits.Count); // ループで全要素を出力 foreach (string fruit in fruits) { Console.WriteLine(fruit); } |
りんご
果物の数: 3
りんご
みかん
ぶどう
実用的な具体例
ここでは、List の検索やソート、配列との相互変換など、実務で役立つ操作を紹介します。
検索と並び替え
List には Contains、IndexOf、Find、Sort、Reverse などのメソッドが用意されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// フルーツリスト List<string> fruits2 = new List<string> { "りんご", "みかん", "ぶどう" }; // Contains で存在チェック bool hasApple = fruits2.Contains("りんご"); Console.WriteLine("りんごがある? " + hasApple); // IndexOf で位置取得 int indexOfMikan = fruits2.IndexOf("みかん"); Console.WriteLine("みかんの位置: " + indexOfMikan); // Find で条件に合う要素を検索 string longNameFruit = fruits2.Find(f => f.Length >= 3); Console.WriteLine("文字数が3文字以上の果物: " + longNameFruit); // ソートやリバースの例 (数値リスト) List<int> scores = new List<int> { 75, 92, 68, 88, 100 }; scores.Sort(); // 昇順 scores.Reverse(); // 逆順 (降順になる) foreach (int s in scores) { Console.WriteLine(s); } |
りんごがある? True
みかんの位置: 1
文字数が3文字以上の果物: りんご
100
92
88
75
68
配列との相互変換と LINQ の活用
ToArray や List<T>(配列) などを使い、配列との変換が可能です。
また、LINQ を用いると条件抽出や要素変換などを宣言的に記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 配列からリストへの変換 int[] arrayData = { 10, 20, 30 }; List<int> listFromArray = new List<int>(arrayData); // リストから配列への変換 int[] scoreArray = listFromArray.ToArray(); // LINQ で偶数のみ抽出 List<int> numbersSample = new List<int> { 1, 2, 3, 4, 5, 6 }; var evenNumbers = numbersSample.Where(n => n % 2 == 0).ToList(); Console.WriteLine("偶数の一覧:"); evenNumbers.ForEach(n => Console.WriteLine(n)); |
偶数の一覧:
2
4
6
注意点
List を使う際に知っておきたい注意点をいくつか挙げます。
- 同時変更に注意:foreach ループ中に要素を追加・削除するとエラーが発生する場合があります
- パフォーマンス:大量データの取り扱い時は、必要に応じた初期容量を設定すると効率的
- 型安全性:List<T> は同じ型の要素を扱うため、異なる型を混在させる場合は要検討
- LINQ の遅延評価:Where や Select は遅延評価されるため、複数回の実行を防ぐ場合は ToList() などで即時評価する
まとめ
C# の List<T> は、動的なサイズ変更や豊富なメソッドを備えた柔軟なコレクションです。
作成・追加・削除・検索・並び替えなど、多彩な操作をシンプルに実装できます。
注意点を押さえたうえで活用すると、より扱いやすく効率的なデータ管理が可能になります。