C# 初心者のための List の使い方ガイド
配列より便利な「可変長リスト」をマスターしよう
はじめに
C#でデータをまとめて扱うとき、まず思い浮かぶのは「配列(Array)」でしょう。しかし、あとから要素を追加したり削除したりしたい場合には、List<T> が圧倒的に便利です。
この記事では、C#の List<T> の基本から、使いどころ、注意点までを初心者向けにわかりやすく解説します。
List とは?
List<T> は、ジェネリックコレクションの1つで、「Tのリスト」と読みます。Tの部分には型名(int、string、自作クラスなど)を入れます。
配列との違い
特徴 | 配列(T[]) | List(List<T>) |
---|---|---|
要素数 | 固定 | 可変 |
要素追加 | 不可(再作成要) | Addメソッドで可能 |
要素削除 | 不可 | Removeメソッドで可能 |
検索・並び替え | 手動で実装 | 便利なメソッドが豊富 |
基本的な使い方
List の宣言と初期化
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string>();
fruits.Add("りんご");
fruits.Add("バナナ");
fruits.Add("みかん");
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}
}
}
- System と Collections.Generic を使います。これにより、画面表示やリスト(List)などが使えるようになります。
- Program というクラスを定義します。ここがプログラムの本体です。
- Main メソッドは、プログラムの実行開始地点です。
- List<string> fruits で、文字列のリスト(果物の入れ物)を作ります。
- そのリストに “りんご", “バナナ", “みかん" を追加します。
- foreach 文で、リストの中の果物をひとつずつ取り出し、Console.WriteLine で画面に表示します。
日本語の「フルーツ」と英語の “fruit/fruits” は、感覚や使い方に微妙な違いがあります。その違いが、プログラミングの命名にも影響します。
🍎 日本語の「フルーツ」と英語の “fruit/fruits” の違い
項目 | 日本語の「フルーツ」 | 英語の “fruit” / “fruits” |
---|---|---|
意味 | 果物全般(主にカタカナ語) | “fruit”:集合名詞 / “fruits”:可算名詞(複数形) |
単数・複数の区別 | あいまい(「フルーツ1つ」など普通に言う) | 明確(“a fruit” vs “fruits”) |
文脈 | 一般に「果物全体」を指す傾向が強い | 文脈によって単数・複数を厳密に区別 |
プログラミングの変数名 | fruits / fruit のような形は馴染みが薄い人も | fruits = リスト、fruit = 要素が自然 |
🍌 英語での “fruit” と “fruits”
英語では…
- fruit(不可算名詞・集合名詞):
- “Fruit is good for you.”(果物は健康に良い)← 種類・量関係なし
- fruits(可算名詞の複数形):
- “Apples and bananas are my favorite fruits.”(りんごとバナナは私のお気に入りの果物です)
→ プログラミングではこの 可算名詞の複数形 “fruits” を使ってリストや配列を表すのが自然。
🍇 プログラミングの命名での違和感
日本語話者には:
- fruits と fruit の違いが「単数・複数」の感覚でピンとこないことがある
- 「fruitList とか fruitArray の方が分かりやすくない?」と感じる人もいる
→ これは 母語の言語構造の違いによる自然な感覚のズレです。
✅ まとめ:プログラミングでのコツ
パターン | 意味 | 推奨される命名 |
---|---|---|
fruit | 1つの果物 | 単数形変数名:fruit, apple |
fruits | 複数の果物 | コレクション名:fruits, fruitList, fruitArray |
つまり:
日本語の「フルーツ」は集合的でぼんやりしていても問題ありませんが、
プログラミングでは英語の文法感覚(単数 vs 複数)を意識する方が読みやすくなります。
これを押さえると、国際的なプロジェクトでも迷いなく命名できるようになります。
実行結果
りんご
バナナ
みかん
よく使うメソッドとプロパティ
メソッド/プロパティ | 説明 | 例 |
---|---|---|
Add(item) | 要素を末尾に追加 | list.Add(“apple") |
Remove(item) | 一致する要素を削除(最初の1つ) | list.Remove(“banana") |
Count | 要素数を取得 | int count = list.Count; |
Clear() | 全要素を削除 | list.Clear(); |
Contains(item) | 指定した要素があるかどうか確認 | list.Contains(“apple") |
IndexOf(item) | 要素のインデックスを取得(なければ-1) | int i = list.IndexOf(“apple") |
Insert(index, item) | 指定位置に要素を挿入 | list.Insert(1, “grape") |
Sort() | 要素を並び替え(昇順) | list.Sort(); |
List を使うときの注意点
値型と参照型の違い
- List<int> のような 値型 では、要素を直接保持しています。
- List<MyClass> のような 参照型 では、要素はオブジェクトへの参照です。
class Person
{
public string Name { get; set; }
}
List<Person> people = new List<Person>();
var p = new Person { Name = "太郎" };
people.Add(p);
p.Name = "次郎";
Console.WriteLine(people[0].Name); // "次郎"
foreach での削除はNG
foreach (var item in list)
{
list.Remove(item); // エラーになる可能性あり
}
代わりに逆順 for ループを使うのが安全です。
応用:オブジェクトのリスト
class Enemy
{
public string Name { get; set; }
public int HP { get; set; }
}
List<Enemy> enemies = new List<Enemy>
{
new Enemy { Name = "スライム", HP = 30 },
new Enemy { Name = "ドラゴン", HP = 300 }
};
foreach (var enemy in enemies)
{
Console.WriteLine($"{enemy.Name} のHPは {enemy.HP} です");
}
まとめ
List<T> は、可変長で柔軟なデータ構造であり、C#のあらゆる場面で登場します。初学者のうちから使い慣れておくと、配列よりも効率よくコードが書けるようになります。
補足:Listを使ったミニ課題
Q. 「名前リスト」に”さとう”, “たなか”, “すずき”を追加し、五十音順に並び替えて表示せよ
List<string> names = new List<string> { "さとう", "たなか", "すずき" };
names.Sort();
foreach (var name in names)
{
Console.WriteLine(name);
}
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 名前リストの作成と初期化
List<string> names = new List<string> { "さとう", "たなか", "すずき" };
// 五十音順に並び替え(Sortは文字列の辞書順で並び替える)
names.Sort();
// 並び替えた名前を表示
foreach (var name in names)
{
Console.WriteLine(name);
}
}
}
次に学ぶと良いもの
- Dictionary<TKey, TValue>:名前と値のペアを管理できる
- LINQ:リストを検索・変換する高機能なツール群
- ReadOnlyCollection<T>:読み取り専用にしてリストの安全性を高める
ディスカッション
コメント一覧
まだ、コメントがありません