0Pricing
C# Academy · レッスン

Listを実践する

要素を追加、削除、検索します。

「Listを実践する」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

なぜ List<T> を使うのか

List<T> は、C# で日常的に使われる動的配列です。System.Collections.Generic に定義されており、項目を追加すると自動的に大きくなります。

通常の配列とは異なり、最初に固定サイズを設定する必要はありません。また、型安全なので、List<int> には int の値だけを格納でき、この制約はコンパイル時に検出されます。

using System.Collections.Generic;

List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);

作成と初期化

コレクション初期化子を使うと、リストをすぐに値で埋めることができます。簡潔で読みやすい書き方です。

コンパイラーは内部で各エントリを Add 呼び出しに変換するため、項目を1つずつ追加した場合と同じ結果になります。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var fruits = new List<string> { "apple", "pear", "plum" };
        Console.WriteLine(fruits.Count);
    }
}

インデックスと Count

配列と同じように、0から始まるインデックスで要素にアクセスします。list[0] は最初の項目です。

リストが保持する項目数を取得するには、Length ではなく Count を使用します。インデックスによる読み取りや書き込みは、O(1) の定数時間で実行されます。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums[1]);
        Console.WriteLine(nums.Count);
    }
}

追加と挿入

Add は償却 O(1) 時間で末尾に追加します。AddRange は複数の項目を一度に追加します。

Insert(index, item) は指定した位置に項目を配置し、その後ろにあるすべての項目を移動します。この移動のため、先頭への Insert は O(n) です。可能であれば末尾への追加を優先してください。

var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, e

項目の削除

Remove(item) は最初に一致した値を削除し、見つかった場合は true を返します。RemoveAt(index) は位置を指定して削除します。

どちらも後続の要素を左に移動するため、中央からの削除は O(n) です。RemoveAll は述語を受け取り、一致する項目をすべて1回の走査で削除します。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 3, 4, 5 };
        nums.RemoveAll(n => n % 2 == 0);
        Console.WriteLine(string.Join(",", nums));
    }
}

リストの検索

Contains は値が存在するかどうかを示し、IndexOf はその位置、または -1 を返します。どちらも線形に走査するため、計算量は O(n) です。

大きなリストを値で何度も検索している場合、その線形コストは積み重なります。HashSet または Dictionary のほうが適している可能性があります。

var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob");   // true
int pos = names.IndexOf("Cy");          // 2

反復処理

すべての要素を読み取るには、foreach ループが最も分かりやすい方法です。インデックスが必要な場合は、従来の for ループも使用できます。

同じリストに対する foreach の中で項目を追加または削除しないでください。InvalidOperationException がスローされます。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var colors = new List<string> { "red", "green", "blue" };
        foreach (var c in colors)
            Console.WriteLine(c);
    }
}

並べ替え

Sort() は既定の比較子を使って、リストをその場で並べ替えます。独自の順序にするには、比較デリゲートを渡します。

並べ替えの計算量は O(n log n) です。元のリストを変更せずに並べ替えたコピーを取得するには、新しいシーケンスを返す LINQ の OrderBy を使用します。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 4, 1, 3, 2 };
        nums.Sort();
        Console.WriteLine(string.Join(",", nums));
    }
}

Capacity と Count の違い

Count は存在する項目数であり、Capacity は内部配列を再割り当てせずに保持できる項目数です。

リストの項目数が容量を超えると、より大きな配列を割り当てて項目をコピーします。通常は容量がほぼ2倍になります。最終的なサイズが分かっている場合は、コンストラクターに渡すことで繰り返しのコピーを避けられます。

var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
    list.Add(i);
// no intermediate reallocations

メソッド引数としての List

List<T> は参照型です。これをメソッドに渡すと参照が渡されるため、メソッド内での変更は呼び出し元のリストに影響します。

読み取りだけを行うメソッドでは、変更しないことを示すために IEnumerable<T> または IReadOnlyList<T> を受け取るようにしてください。

using System;
using System.Collections.Generic;

class Program {
    static void AddOne(List<int> xs) => xs.Add(1);
    static void Main() {
        var nums = new List<int>();
        AddOne(nums);
        Console.WriteLine(nums.Count); // 1
    }
}

変換とコピー

ToArray() は固定サイズの配列を生成し、new List<T>(other) は別のシーケンスの浅いコピーを作成します。

浅いコピーではリストの構造だけが複製され、要素への参照は共有されます。そのため、格納されたオブジェクトを変更すると、両方のリストからその変更が確認できます。

var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);

確認問題

計算量が際立って大きい操作を選んでください。

まとめ

List<T> は拡張可能で型安全な配列です。インデックスによるアクセスと Count は O(1)、末尾への Add は償却 O(1) です。

中央への挿入、削除、値による検索は、要素の移動や走査が必要なため O(n) です。サイズが分かっている場合は、再割り当てを避けるために容量をあらかじめ確保してください。

よくある質問

「Listを実践する」レッスンは無料ですか?

はい。「Listを実践する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「Listを実践する」で何を学びますか?

要素を追加、削除、検索します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Listを実践する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Listを実践する
  2. Dictionaryの検索
  3. HashSetと一意性
  4. コレクションを選ぶ
← C# Academyに戻る