基礎から学ぶC#入門 90日コース | 配列・コレクション・文字列 - Day 23:List

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 23 のゴールと全体像

Day 23 では、配列よりも柔軟に使えるコレクション型 List<T> を学びます。 List<T> は「要素数が増えたり減ったりする配列のようなもの」で、 現場の C# コードでも非常によく使われる重要なクラスです。

学ぶ内容は次のとおりです。

  • List<T>
  • Add
  • Remove
  • RemoveAt
  • Count
  • Clear

これらをステップバイステップで理解しながら、 「配列では少し不便だったところを、List でどう解決できるか」を体感していきます。

List<T> とは

「サイズが変えられる配列」のようなコレクション

配列は、

  • 作るときに「要素数」を決める必要がある
  • 途中で「増やしたり減らしたり」ができない

という制約がありました。

それに対して List<T> は、

要素数をあとから増やしたり減らしたりできる、柔軟なコレクション

です。

T は「型」を表すジェネリック型パラメータで、

  • List<int> → int のリスト
  • List<string> → string のリスト

というように使います。

List<T> の基本的な宣言

using System;
using System.Collections.Generic; // List<T> を使うために必要

class Program
{
    static void Main(string[] args)
    {
        // int 型の List を作成します
        List<int> numbers = new List<int>();

        // string 型の List を作成します
        List<string> names = new List<string>();

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • List<T> を使うには、System.Collections.Generic 名前空間を using する必要があります。
  • new List<int>() の時点では、要素数は 0(空のリスト)です。

Add:要素を追加する

リストの末尾に値を追加

Add メソッドは、

リストの末尾に新しい要素を追加する

ためのメソッドです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<int> numbers = new List<int>();

        // 要素を追加していきます
        numbers.Add(10);
        numbers.Add(20);
        numbers.Add(30);

        // 追加された要素を表示します
        for (int i = 0; i < numbers.Count; i++)
        {
            Console.WriteLine($"numbers[{i}] = {numbers[i]}");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Add を呼ぶたびに、リストの要素数が 1 つ増えます。
  • 配列と違って、「最初にサイズを決めておく」必要がありません。

Count:要素数を取得する

List の「今の長さ」を知る

配列では Length でしたが、List<T> では Count プロパティで要素数を取得します。

Console.WriteLine(numbers.Count); // 3 と表示されます
C#

Count は、

「今、リストにいくつ要素が入っているか」

を教えてくれるプロパティです。

Count を使ったループ

配列のときと同じように、Count を使って安全にループを書けます。

for (int i = 0; i < numbers.Count; i++)
{
    Console.WriteLine($"numbers[{i}] = {numbers[i]}");
}
C#

重要ポイント:

  • List<T> では Length ではなく Count を使います。
  • 要素を追加・削除すると、Count の値も変わります。

Remove:値を指定して削除する

「この値を消したい」というときに使う

Remove メソッドは、

指定した値と一致する要素を、リストから削除する

ためのメソッドです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<int> numbers = new List<int> { 10, 20, 30, 20 };

        // 値 20 を削除します(最初に見つかった 20 が削除されます)
        bool removed = numbers.Remove(20);

        Console.WriteLine($"削除成功?: {removed}"); // true

        // 結果を表示します
        for (int i = 0; i < numbers.Count; i++)
        {
            Console.WriteLine($"numbers[{i}] = {numbers[i]}");
        }

        Console.ReadLine();
    }
}
C#

この例では、

  • 元のリスト:[10, 20, 30, 20]
  • Remove(20) のあと:[10, 30, 20]

となります。

重要ポイント:

  • Remove(value) は、最初に見つかった 1 つだけを削除します。
  • 戻り値の bool は、「削除に成功したかどうか」を表します。
    • 削除できた → true
    • 該当する値がなかった → false

RemoveAt:インデックスを指定して削除する

「何番目の要素を消したいか」で削除

RemoveAt メソッドは、

インデックスを指定して、その位置の要素を削除する

ためのメソッドです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> names = new List<string> { "Alice", "Bob", "Charlie" };

        // インデックス 1 の要素("Bob")を削除します
        names.RemoveAt(1);

        // 結果を表示します
        for (int i = 0; i < names.Count; i++)
        {
            Console.WriteLine($"names[{i}] = {names[i]}");
        }

        Console.ReadLine();
    }
}
C#

この例では、

  • 元のリスト:["Alice", "Bob", "Charlie"]
  • RemoveAt(1) のあと:["Alice", "Charlie"]

となります。

重要ポイント:

  • インデックスが範囲外(0Count - 1 以外)の場合、例外が発生します。
  • 「位置で消したい」ときは RemoveAt、「値で消したい」ときは Remove を使い分けます。

Clear:すべての要素を削除する

リストを「空」に戻す

Clear メソッドは、

リストのすべての要素を削除して、空の状態に戻す

ためのメソッドです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<int> numbers = new List<int> { 10, 20, 30 };

        Console.WriteLine($"削除前の Count: {numbers.Count}"); // 3

        // すべての要素を削除します
        numbers.Clear();

        Console.WriteLine($"削除後の Count: {numbers.Count}"); // 0

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Clear のあとでも、リスト自体は存在しています(null にはなりません)。
  • 「中身だけ全部消したい」ときに使います。

例題:買い物リストを List<string> で管理する

Add / Remove / Count / Clear の総合練習

ここまでのメソッドを組み合わせて、 簡単な「買い物リスト」を作ってみます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // 買い物リストを List<string> で管理します
        List<string> shoppingList = new List<string>();

        // アイテムを追加
        shoppingList.Add("牛乳");
        shoppingList.Add("パン");
        shoppingList.Add("卵");

        Console.WriteLine("=== 買い物リスト ===");
        PrintList(shoppingList);

        // 「パン」を削除
        Console.WriteLine("\n\"パン\" を削除します。");
        shoppingList.Remove("パン");
        PrintList(shoppingList);

        // インデックス 0 のアイテムを削除
        Console.WriteLine("\nインデックス 0 のアイテムを削除します。");
        shoppingList.RemoveAt(0);
        PrintList(shoppingList);

        // リストをクリア
        Console.WriteLine("\nリストをクリアします。");
        shoppingList.Clear();
        PrintList(shoppingList);

        Console.ReadLine();
    }

    // List<string> の中身を表示するメソッド
    static void PrintList(List<string> list)
    {
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }
}
C#

ここでの重要ポイント:

  • Add でアイテムを追加し、Remove / RemoveAt で削除し、Count で要素数を確認し、Clear で全部消す、という一連の流れを体験できます。
  • List<T> は「増えたり減ったりする配列」として、現実のアプリケーションでも非常に使いやすいです。

練習テンプレート:List<T> の基本形

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // int のリストを作成
        List<int> numbers = new List<int>();

        // 追加
        numbers.Add(1);
        numbers.Add(2);
        numbers.Add(3);

        // 表示
        Console.WriteLine("=== 追加後 ===");
        PrintIntList(numbers);

        // 値 2 を削除
        numbers.Remove(2);
        Console.WriteLine("=== Remove(2) 後 ===");
        PrintIntList(numbers);

        // インデックス 0 を削除
        numbers.RemoveAt(0);
        Console.WriteLine("=== RemoveAt(0) 後 ===");
        PrintIntList(numbers);

        // クリア
        numbers.Clear();
        Console.WriteLine("=== Clear() 後 ===");
        PrintIntList(numbers);

        Console.ReadLine();
    }

    static void PrintIntList(List<int> list)
    {
        Console.WriteLine($"Count: {list.Count}");
        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }
        if (list.Count == 0)
        {
            Console.WriteLine("(空のリストです)");
        }
    }
}
C#

Day 23 のまとめ

Day 23 では、配列よりも柔軟なコレクションである List<T> を学びました。

  • List<T>:サイズをあとから増減できる「配列のようなコレクション」
  • Add:末尾に要素を追加
  • Remove:値を指定して削除(最初の 1 件)
  • RemoveAt:インデックスを指定して削除
  • Count:現在の要素数
  • Clear:すべての要素を削除して空にする

というメソッドを通して、

「増えたり減ったりするデータの集まりを、自然に扱う」

ための感覚を身につけました。

次のステップでは、

  • List<T>foreach の組み合わせ
  • List<T> に対する検索やソート
  • 他のコレクション(Dictionary<TKey, TValue> など)

へと進んでいくことで、 より豊かな「データ構造とコレクション」の世界に入っていくことができます。

ぜひ、List<T> を使って、 自分なりの「リスト管理プログラム」をいくつか作ってみてください。


Day 23 ミニ課題のゴールと全体像

Day 23 のミニ課題では、List<T> を使って「買い物リスト」を作ることを目標にします。 ここまで学んだ List<T>AddRemoveRemoveAtCountClear を、 実際の小さなアプリケーションの形にまとめていく練習になります。

ここでは、

  • 買い物リストを List<string> で表現する
  • アイテムの追加・削除・一覧表示を行う
  • リストの状態を Count で確認し、Clear で空にする

という流れで、ステップバイステップで解説していきます。

買い物リストを List<string> で表現する

まずは「リスト」という入れ物を用意する

買い物リストは「文字列(商品名)の集まり」ですので、 List<string> を使って表現するのが自然です。

using System;
using System.Collections.Generic; // List<T> を使うために必要

class Program
{
    static void Main(string[] args)
    {
        // 買い物リストを List<string> で管理します
        List<string> shoppingList = new List<string>();

        Console.ReadLine();
    }
}
C#

ポイント:

  • List<string> は「文字列のリスト」です。
  • 最初は空のリスト(要素数 0)からスタートします。

Add:買い物リストにアイテムを追加する

「買うもの」をどんどん追加していく

Add メソッドで、買い物リストに商品名を追加していきます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> shoppingList = new List<string>();

        // 買うものを追加していきます
        shoppingList.Add("牛乳");
        shoppingList.Add("パン");
        shoppingList.Add("卵");

        // 現在のリストを表示します
        PrintList(shoppingList);

        Console.ReadLine();
    }

    // 買い物リストの中身を表示するメソッド
    static void PrintList(List<string> list)
    {
        Console.WriteLine("=== 買い物リスト ===");
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }
}
C#

重要ポイント:

  • Add を呼ぶたびに、リストの末尾に 1 つアイテムが追加されます。
  • Count で「今いくつアイテムがあるか」を確認できます。

Remove:商品名を指定して削除する

「もういらないもの」を名前で消す

Remove は、指定した値と一致する要素を削除するメソッドです。 買い物リストでは、「この商品はもう買わない」と決めたときに使えます。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> shoppingList = new List<string>
        {
            "牛乳",
            "パン",
            "卵",
            "パン" // 同じ商品が複数入っている場合もあります
        };

        Console.WriteLine("=== 削除前 ===");
        PrintList(shoppingList);

        // 「パン」を削除します(最初に見つかった 1 件だけ削除されます)
        bool removed = shoppingList.Remove("パン");
        Console.WriteLine($"\n\"パン\" の削除成功?: {removed}");

        Console.WriteLine("\n=== 削除後 ===");
        PrintList(shoppingList);

        Console.ReadLine();
    }

    static void PrintList(List<string> list)
    {
        Console.WriteLine("=== 買い物リスト ===");
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }
}
C#

重要ポイント:

  • Remove("パン") は、最初に見つかった「パン」だけを削除します。
  • 戻り値の bool は、「削除できたかどうか」を表します。

RemoveAt:インデックスで削除する

「何番目のアイテムか」で削除する

RemoveAt は、インデックスを指定して削除するメソッドです。 「リストの 0 番目を消したい」「2 番目を消したい」といったときに使います。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> shoppingList = new List<string>
        {
            "牛乳",
            "パン",
            "卵"
        };

        Console.WriteLine("=== 削除前 ===");
        PrintList(shoppingList);

        // インデックス 1 のアイテム(「パン」)を削除します
        Console.WriteLine("\nインデックス 1 のアイテムを削除します。");
        shoppingList.RemoveAt(1);

        Console.WriteLine("\n=== 削除後 ===");
        PrintList(shoppingList);

        Console.ReadLine();
    }

    static void PrintList(List<string> list)
    {
        Console.WriteLine("=== 買い物リスト ===");
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }
}
C#

重要ポイント:

  • インデックスは 0 から始まります。
  • 範囲外のインデックス(0Count - 1 以外)を指定すると例外が出るので注意が必要です。

Clear:リストを空にする

「今日はもう買い物終わり」と決めたとき

Clear は、リストのすべての要素を削除して、空の状態に戻すメソッドです。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> shoppingList = new List<string>
        {
            "牛乳",
            "パン",
            "卵"
        };

        Console.WriteLine("=== Clear 前 ===");
        PrintList(shoppingList);

        // リストを空にします
        Console.WriteLine("\nリストをクリアします。");
        shoppingList.Clear();

        Console.WriteLine("\n=== Clear 後 ===");
        PrintList(shoppingList);

        Console.ReadLine();
    }

    static void PrintList(List<string> list)
    {
        Console.WriteLine("=== 買い物リスト ===");
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }
}
C#

重要ポイント:

  • Clear のあとでも、リスト自体は存在していて、また Add で追加できます。
  • 「中身だけ全部消す」ための操作です。

ミニ課題完成版:対話型の買い物リスト

ユーザー入力でリストを操作する簡易アプリ

最後に、List<string> を使って、 ユーザーがコマンドを入力して買い物リストを操作できる簡易アプリの例を示します。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> shoppingList = new List<string>();

        while (true)
        {
            Console.WriteLine();
            Console.WriteLine("=== 買い物リストメニュー ===");
            Console.WriteLine("1: アイテムを追加");
            Console.WriteLine("2: アイテム名で削除");
            Console.WriteLine("3: インデックスで削除");
            Console.WriteLine("4: リストを表示");
            Console.WriteLine("5: リストをクリア");
            Console.WriteLine("0: 終了");
            Console.Write("番号を選んでください:");

            string? input = Console.ReadLine();

            if (input == "0")
            {
                Console.WriteLine("終了します。");
                break;
            }

            switch (input)
            {
                case "1":
                    AddItem(shoppingList);
                    break;

                case "2":
                    RemoveByName(shoppingList);
                    break;

                case "3":
                    RemoveByIndex(shoppingList);
                    break;

                case "4":
                    PrintList(shoppingList);
                    break;

                case "5":
                    ClearList(shoppingList);
                    break;

                default:
                    Console.WriteLine("不正な入力です。0〜5 の番号を選んでください。");
                    break;
            }
        }
    }

    // アイテムを追加する
    static void AddItem(List<string> list)
    {
        Console.Write("追加するアイテム名を入力してください:");
        string? name = Console.ReadLine();

        if (!string.IsNullOrWhiteSpace(name))
        {
            list.Add(name);
            Console.WriteLine($"\"{name}\" をリストに追加しました。");
        }
        else
        {
            Console.WriteLine("空の名前は追加できません。");
        }
    }

    // アイテム名で削除する
    static void RemoveByName(List<string> list)
    {
        Console.Write("削除するアイテム名を入力してください:");
        string? name = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(name))
        {
            Console.WriteLine("空の名前は削除できません。");
            return;
        }

        bool removed = list.Remove(name);

        if (removed)
        {
            Console.WriteLine($"\"{name}\" を削除しました。");
        }
        else
        {
            Console.WriteLine($"\"{name}\" はリストに見つかりませんでした。");
        }
    }

    // インデックスで削除する
    static void RemoveByIndex(List<string> list)
    {
        if (list.Count == 0)
        {
            Console.WriteLine("リストが空です。削除できません。");
            return;
        }

        PrintList(list);

        Console.Write("削除するインデックスを入力してください:");
        string? input = Console.ReadLine();

        if (int.TryParse(input, out int index))
        {
            if (index >= 0 && index < list.Count)
            {
                string removedItem = list[index];
                list.RemoveAt(index);
                Console.WriteLine($"インデックス {index} の \"{removedItem}\" を削除しました。");
            }
            else
            {
                Console.WriteLine("インデックスが範囲外です。");
            }
        }
        else
        {
            Console.WriteLine("数値として認識できませんでした。");
        }
    }

    // リストを表示する
    static void PrintList(List<string> list)
    {
        Console.WriteLine("=== 現在の買い物リスト ===");
        Console.WriteLine($"アイテム数: {list.Count}");

        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine($"[{i}] {list[i]}");
        }

        if (list.Count == 0)
        {
            Console.WriteLine("(リストは空です)");
        }
    }

    // リストをクリアする
    static void ClearList(List<string> list)
    {
        list.Clear();
        Console.WriteLine("リストをクリアしました。");
    }
}
C#

この完成版で体験できること:

  • List<string> を使った「増える・減る」リスト管理
  • AddRemoveRemoveAtCountClear の実践的な使い方
  • ユーザー入力と組み合わせた簡易ツールの構成

Day 23 ミニ課題のまとめ

このミニ課題では、

  • List<T> を使って「買い物リスト」を表現する
  • Add で追加し、RemoveRemoveAt で削除し、Count で状態を確認し、Clear で空にする
  • 小さな対話型プログラムとしてまとめる

という流れで、List<T> を実際の用途に結びつけて学びました。

List<T> は、

「増えたり減ったりするデータの集まり」を扱うときの基本ツール

です。

ぜひ、

  • 買い物リストを「やることリスト(ToDo)」に変えてみる
  • アイテムに「優先度」や「カテゴリ」を追加してみる(後に classDictionary に発展できます)

など、少しずつアレンジを加えながら、 List<T> を自分のプログラムの中で自然に使いこなせるようになっていってください。

タイトルとURLをコピーしました