新人エンジニア研修で知っておきたいListの使い方

なぜ、Listの理解が重要なのか、その理由

この記事では、弊社の新人エンジニア研修の参考にC#を解説します。

私たちは既に配列を学んでいます。配列のメリットは、同じ型のデータをまとめられる点にありました。繰り返し処理と組み合わせて、複数の要素に対して一気に処理をするということも容易でした。

しかし、配列にはデメリットもありました。それは、要素の数をあらかじめ指定しなければならないということです。

もしも、要素の数にあわせて伸び縮みする配列があったらさらに便利だと思いませんか?

実はそんなクラスがあるのです。

こんにちは。ゆうせいです。
今回はC#のList<T>について解説します!List<T>は、柔軟で使いやすいデータ構造で、配列のような感覚で使える上に、要素数が動的に増減する便利な機能を持っています。ジェネリクスや便利なメソッドについても触れながら、初心者でも使いこなせるように丁寧に説明していきますね。


List<T>とは?

List<T>は、C#で提供されている動的配列の一種です。配列と似ていますが、以下の特徴があります。

  • 要素数が自動的に伸縮する
  • 要素の追加、削除、検索といった操作が簡単
  • ジェネリクスを使用して型安全に扱える

つまり、固定サイズの配列と違い、サイズを気にせず使えるのが大きな利点です!


List<T>の使い方

まずは基本的な操作方法から見てみましょう。

例1: List<T>の初期化と要素操作

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Listの初期化
        List<string> names = new List<string> { "Alice", "Bob", "Charlie" };

        // 要素の追加
        names.Add("Diana");

        // 要素の削除
        names.Remove("Bob");

        // 要素数の取得
        Console.WriteLine($"要素数: {names.Count}");

        // 要素のループ処理
        foreach (var name in names)
        {
            Console.WriteLine(name);
        }
    }
}

結果

上記のコードを実行すると、以下のような結果が表示されます。

要素数: 3
Alice
Charlie
Diana

ジェネリクスとは?

C#では、List<T>Tに型を指定することで、特定の型だけを格納できるようになります。この<T>の仕組みをジェネリクスといいます。

例えば、以下のように書くことで、List<int>は整数専用、List<string>は文字列専用のリストになります。

List<int> numbers = new List<int> { 1, 2, 3 };
List<string> names = new List<string> { "Alice", "Bob" };

型安全なコード

ジェネリクスを使うことで、リストに異なる型のデータが混ざるのを防ぎ、実行時のエラーを防ぐことができます。


List<T>の便利なメソッド

List<T>には多くの便利なメソッドがあります。いくつか代表的なものを紹介します。

1. 要素の検索

List<string> names = new List<string> { "Alice", "Bob", "Charlie" };
bool containsAlice = names.Contains("Alice"); // true
int index = names.IndexOf("Bob"); // 1

  • Contains: 指定した要素が存在するかチェック
  • IndexOf: 指定した要素が最初に見つかった位置を返す

2. 条件に基づく削除

RemoveAllメソッドを使うと、特定の条件に一致する要素を一括で削除できます。

List<string> names = new List<string> { "Alice", "Anna", "Bob" };
names.RemoveAll(name => name.StartsWith("A")); // "Alice"と"Anna"を削除


3. ソート

リストの要素を並び替える場合はSortを使用します。

List<int> numbers = new List<int> { 5, 2, 8, 1 };
numbers.Sort(); // 昇順に並び替え


注意点

foreachループでの削除操作はNG

List<T>foreachループで回しながら要素を削除しようとすると、InvalidOperationExceptionがスローされます。

foreach (var name in names)
{
    if (name.StartsWith("A"))
    {
        names.Remove(name); // 例外が発生する
    }
}

このような場合は、forループを使うか、RemoveAllメソッドを活用しましょう。


List<T>と配列の違い

特徴配列 (Array)List<T>
サイズの変更固定動的に伸縮
型安全性サポート(ジェネリクスなし)サポート(ジェネリクスあり)
検索や削除のメソッドなしあり

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□ Listは、要素数に応じて動的に伸縮する配列である。要素の追加、削除、検索など、便利なメソッドを多く持つ。

□ ジェネリクスとは、クラスやメソッドに型パラメータを与えることで、様々な型に対応する汎用的な設計を可能にする機能である。C#では<>記号を使用して型を指定する。

□ 型パラメータに格納できるのはオブジェクト型のみである。ただし、C#では値型もボックス化(ボクシング)されずに扱える仕組みがあるため、例えばint型やdouble型なども格納可能である。

□ コレクションフレームワークとは、オブジェクトの集合を効率的に操作するために設計されたクラス群を指す。C#ではSystem.CollectionsとSystem.Collections.Generic名前空間に含まれるクラスが該当する。

□ Listの要素をforeachループで削除することは避ける。ループ中にコレクションを変更すると、InvalidOperationExceptionがスローされる可能性がある。その場合は、forループやRemoveAllメソッドを使用するのが望ましい。

これらのポイントを押さえながら、List<T>をどんどん使ってみてください!初めて使うときは、簡単なプログラムから始めるのがおすすめです。それでは、ぜひ試してみてくださいね!

まとめができたら、アウトプットとして演習問題にチャレンジしましょう。