C#のListから要素を削除しよう!Remove・RemoveAt・Clearを初心者向けに解説
前回の記事「C#の配列をListに変更しよう!Add・Count・foreachを初心者向けに解説」では、List<Student>を作り、Addで生徒をあとから追加しました。
データを追加できるようになると、次に気になるのは「間違えて登録した生徒を削除したいときは、どうするの?」という点です。
Listには、要素を削除するためのメソッドも用意されています。
Remove:指定した要素を削除するRemoveAt:番号を指定して削除するClear:すべての要素を削除する
この記事では、前回と同じStudentリストを使い、3つの削除方法を1つずつ確認します。削除後のCountや番号がどう変わるかも見ていきましょう。
Listから要素を削除する3つの方法
最初に、3つの削除方法の違いを図で確認します。

Removeは要素、RemoveAtは番号を指定します。ClearはListを空にします。どの方法でも、削除された後は残った要素が前へ詰まります。配列のように、削除した場所が空いたまま残るわけではありません。
今回使うStudentリスト
今回は、田中さん、鈴木さん、佐藤さんの3人をListに入れておきます。
Student student1 = new Student();
student1.Name = "田中";
student1.Score = 80;
Student student2 = new Student();
student2.Name = "鈴木";
student2.Score = 95;
Student student3 = new Student();
student3.Name = "佐藤";
student3.Score = 70;
List<Student> students = new List<Student>();
students.Add(student1);
students.Add(student2);
students.Add(student3);
この時点で、students.Countは3です。
students[0] → 田中さん
students[1] → 鈴木さん
students[2] → 佐藤さん
このListから、真ん中の鈴木さんを削除してみましょう。
Removeで指定した要素を削除する
Removeは、削除したい要素そのものを指定します。
students.Remove(student2);
student2は鈴木さんなので、Listから鈴木さんが削除されます。
削除前:田中さん、鈴木さん、佐藤さん
削除後:田中さん、佐藤さん
削除後は、後ろにいた佐藤さんが前へ詰まります。students.Countは3から2に変わります。
Removeの戻り値を確認する
Removeは、削除できたかどうかをboolで返します。
bool removed = students.Remove(student2);
Console.WriteLine(removed);
- 削除できた場合:
true - 指定した要素が見つからなかった場合:
false
同じstudent2をもう一度削除しようとすると、すでにListには入っていないためfalseになります。エラーにはならない点も特徴です。
RemoveAtで番号を指定して削除する
RemoveAtは、Listの番号を指定して削除します。
students.RemoveAt(1);
Listの番号は0から始まります。そのため、RemoveAt(1)で削除されるのは2人目の鈴木さんです。
RemoveAt(0) → 1人目を削除
RemoveAt(1) → 2人目を削除
RemoveAt(2) → 3人目を削除
画面に表示する「1人目」と、Listで使う番号0には1のずれがあります。利用者が入力した番号を使うときは、この違いに注意しましょう。
削除後は番号が前へ詰まる
students.RemoveAt(1)で鈴木さんを削除すると、佐藤さんの番号が変わります。
削除前
students[0] → 田中さん
students[1] → 鈴木さん
students[2] → 佐藤さん
削除後
students[0] → 田中さん
students[1] → 佐藤さん
削除された1番が空欄になるのではなく、後ろの要素が前へ移動します。削除前の番号を、そのまま使い続けないようにしましょう。
存在しない番号を指定するとエラーになる
RemoveAtでは、Listに存在しない番号を指定するとエラーになります。
students.RemoveAt(10); // 10番は存在しないのでエラー
削除する前に、番号が0以上で、Countより小さいことを確認すると安全です。
int index = 1;
if (index >= 0 && index < students.Count)
{
students.RemoveAt(index);
}
students.Countが3なら、使える番号は0、1、2です。3はCountと同じ値ですが、存在しない番号です。
Clearですべての要素を削除する
Clearは、Listに入っている要素をすべて削除します。
students.Clear();
実行後のstudents.Countは0です。Listそのものがなくなるのではなく、中身が空になります。
students.Clear();
Console.WriteLine(students.Count); // 0
空になったListには、もう一度Addで生徒を追加できます。
番号を入力して生徒を削除する
利用者に削除する生徒の番号を入力してもらう場合は、画面上の番号から1を引いてListの番号へ変換します。
Console.Write("削除する生徒の番号を入力してください:");
int number = int.Parse(Console.ReadLine());
int index = number - 1;
if (index >= 0 && index < students.Count)
{
students.RemoveAt(index);
Console.WriteLine("生徒を削除しました。");
}
else
{
Console.WriteLine("その番号の生徒はいません。");
}
利用者が「2」と入力した場合、indexは1になります。そのため、Listの1番に入っている2人目の生徒が削除されます。
完成コード
using System;
using System.Collections.Generic;
namespace StudentListRemoveTutorial
{
internal class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
students.Add(new Student { Name = "田中", Score = 80 });
students.Add(new Student { Name = "鈴木", Score = 95 });
students.Add(new Student { Name = "佐藤", Score = 70 });
Console.WriteLine("登録されている生徒を表示します。");
for (int i = 0; i < students.Count; i++)
{
Console.WriteLine($"{i + 1}:{students[i].Name}さん {students[i].Score}点");
}
Console.WriteLine();
Console.Write("削除する生徒の番号を入力してください:");
int number = int.Parse(Console.ReadLine());
int index = number - 1;
if (index >= 0 && index < students.Count)
{
students.RemoveAt(index);
Console.WriteLine("生徒を削除しました。");
}
else
{
Console.WriteLine("その番号の生徒はいません。");
}
Console.WriteLine();
Console.WriteLine("削除後の生徒を表示します。");
foreach (var student in students)
{
student.ShowScore();
}
}
}
class Student
{
public string Name;
public int Score;
public void ShowScore()
{
Console.WriteLine($"{Name}さんの点数は{Score}点です。");
}
}
}
Visual Studioの設定によっては、Console.ReadLine()やNameに関する警告が表示されることがあります。まずはListから削除する流れに注目して、動きを確認してみましょう。
foreach文の途中で削除しない
初心者が特に気をつけたいのは、foreach文でListを繰り返している途中に、同じListから要素を削除しないことです。
foreach (var student in students)
{
students.Remove(student); // 繰り返し中の削除はエラーになる
}
foreach文は、Listの中身を順番に見ています。その途中で要素数が変わると、次にどこを見ればよいか分からなくなるためです。
今回の完成コードのように、表示する処理と削除する処理を分けると理解しやすく、安全に書けます。
Remove・RemoveAt・Clearの使い分け
- 削除したい要素を持っている:
Remove - 削除したい位置が分かっている:
RemoveAt - Listを空にしたい:
Clear
画面に「1人目」「2人目」と番号を表示し、利用者に選んでもらう場合はRemoveAtが分かりやすいでしょう。
一方、削除したいStudentをすでに変数として持っている場合は、Removeを使えます。
今回のまとめ
Removeで、指定した要素をListから削除できるRemoveは、削除できたかどうかをboolで返すRemoveAtで、番号を指定して削除できる- Listの番号は0から始まる
- 削除後は、後ろの要素が前へ詰まる
Clearで、Listの中身をすべて削除できる- 削除すると
Countも自動的に変わる foreach文で繰り返している途中に、同じListから削除しない
追加するときはAdd、削除するときはRemove・RemoveAt・Clearを使います。
まずは3人のListを作り、真ん中の1人を削除して、Countと番号がどう変わるかを確認してみてください。








ディスカッション
コメント一覧
まだ、コメントがありません