C#のListから要素を削除しよう!Remove・RemoveAt・Clearを初心者向けに解説

広告

前回の記事「C#の配列をListに変更しよう!Add・Count・foreachを初心者向けに解説」では、List<Student>を作り、Addで生徒をあとから追加しました。

データを追加できるようになると、次に気になるのは「間違えて登録した生徒を削除したいときは、どうするの?」という点です。

Listには、要素を削除するためのメソッドも用意されています。

  • Remove:指定した要素を削除する
  • RemoveAt:番号を指定して削除する
  • Clear:すべての要素を削除する

この記事では、前回と同じStudentリストを使い、3つの削除方法を1つずつ確認します。削除後のCountや番号がどう変わるかも見ていきましょう。

Listから要素を削除する3つの方法

最初に、3つの削除方法の違いを図で確認します。

C#のListからRemove、RemoveAt、Clearで生徒を削除する方法の比較図
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、削除するときはRemoveRemoveAtClearを使います。

まずは3人のListを作り、真ん中の1人を削除して、Countと番号がどう変わるかを確認してみてください。

次は、Listに入れた生徒を条件に合わせて探してみましょう。「C#のListから生徒を検索しよう!foreach・Find・FindAllを初心者向けに解説」へ進むと、1件だけ探す方法と複数件を探す方法を学べます。

訪問数 7 回, 今日の訪問数 7回

広告