List<T>.Add() / Remove() / Clear()
| 対応: | C# 2.0(2005) |
|---|
可変長リストに要素を追加する『Add()』、要素を削除する『Remove()』、すべての要素を削除する『Clear()』メソッドです。
構文
using System.Collections.Generic; // List<T> を作成します。 List<T> list = new List<T>(); // 末尾に要素を追加します。 list.Add(T item) // 指定した要素を最初に見つかった位置から削除します。削除できた場合は true を返します。 list.Remove(T item) // 指定したインデックスの要素を削除します。 list.RemoveAt(int index) // すべての要素を削除します。 list.Clear()
メソッド一覧
| メソッド | 概要 |
|---|---|
| Add(T item) | リストの末尾に要素を追加します。 |
| AddRange(IEnumerable<T> collection) | コレクションのすべての要素をリストの末尾にまとめて追加します。 |
| Remove(T item) | 指定した値と一致する最初の要素をリストから削除します。削除できれば true を返します。 |
| RemoveAt(int index) | 指定したインデックスの要素を削除します。 |
| Clear() | リストのすべての要素を削除します。Count が 0 になります。 |
サンプルコード
Add() で要素を追加し、Remove() / RemoveAt() で削除します。
Program.cs
using System;
using System.Collections.Generic;
List<string> members = new List<string>();
members.Add("五条悟");
members.Add("虎杖悠仁");
members.Add("伏黒恵");
Console.WriteLine(string.Join(", ", members));
string[] additional = { "釘崎野薔薇", "両面宿儺" };
members.AddRange(additional);
Console.WriteLine(string.Join(", ", members));
members.Remove("虎杖悠仁");
Console.WriteLine(string.Join(", ", members));
members.RemoveAt(0);
Console.WriteLine(string.Join(", ", members));
members.Clear();
Console.WriteLine(members.Count);
dotnet run 五条悟, 虎杖悠仁, 伏黒恵 五条悟, 虎杖悠仁, 伏黒恵, 釘崎野薔薇, 両面宿儺 五条悟, 伏黒恵, 釘崎野薔薇, 両面宿儺 伏黒恵, 釘崎野薔薇, 両面宿儺 0
RemoveAll() で条件に合う全要素を削除する
Remove() は最初に見つかった1件しか削除しません。条件に合うすべての要素を削除するには RemoveAll() を使います。引数にはラムダ式で削除条件を指定します。
RemoveAllSample.cs
using System;
using System.Collections.Generic;
List<int> scores = new List<int> { 85, 40, 92, 35, 78, 50, 61 };
// 50点未満の要素をすべて削除する
int removed = scores.RemoveAll(s => s < 50);
Console.WriteLine($"削除した要素数: {removed}");
Console.WriteLine(string.Join(", ", scores));
dotnet run 削除した要素数: 2 85, 92, 78, 50, 61
実践パターン: リストの動的な構築
List<T> は要素数があらかじめわからない場合の動的なデータ収集によく使われます。処理が終わったら ToArray() や string.Join() で出力します。
BuildList.cs
using System;
using System.Collections.Generic;
// 1〜20の中から偶数だけをリストに集める
List<int> evens = new List<int>();
for (int i = 1; i <= 20; i++)
{
if (i % 2 == 0)
{
evens.Add(i);
}
}
Console.WriteLine($"偶数の個数: {evens.Count}");
Console.WriteLine(string.Join(", ", evens));
// ToArray() で配列に変換する
int[] arr = evens.ToArray();
Console.WriteLine(arr.GetType().Name); // Int32[]
dotnet run 偶数の個数: 10 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 Int32[]
よくあるミス
よくあるミス: Remove() は最初の1件しか削除しない
Remove() は同じ値が複数ある場合でも、最初に見つかった1件のみを削除します。全件削除したい場合は RemoveAll() を使ってください。
using System;
using System.Collections.Generic;
List<string> names = new List<string> { "虎杖悠仁", "五条悟", "虎杖悠仁", "伏黒恵" };
// NG: Remove() は最初の1件しか削除されない
names.Remove("虎杖悠仁");
Console.WriteLine(string.Join(", ", names)); // 五条悟, 虎杖悠仁, 伏黒恵(まだ残っている)
dotnet run 五条悟, 虎杖悠仁, 伏黒恵
修正後は次の通りです。
using System;
using System.Collections.Generic;
// OK: RemoveAll() ですべて削除する
List<string> names = new List<string> { "虎杖悠仁", "五条悟", "虎杖悠仁", "伏黒恵" };
names.RemoveAll(n => n == "虎杖悠仁");
Console.WriteLine(string.Join(", ", names)); // 五条悟, 伏黒恵
dotnet run 五条悟, 伏黒恵
概要
List<T> は C# で最もよく使われるコレクションクラスです。内部的には配列で実装されており、末尾への追加(Add())は高速ですが、途中への挿入・削除は後続要素のシフトが発生するため要素数が多い場合は注意が必要です。
Remove() は一致する最初の要素のみ削除します。同じ値が複数ある場合、すべて削除したい場合は RemoveAll() を使用してください。
要素の挿入と要素数の取得には『List<T>.Insert() / Count』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。