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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Listを実践する
- Dictionaryの検索
- HashSetと一意性
- コレクションを選ぶ