スポンサーリンク

【C#】リストの要素を削除する

C#における、リストの要素を削除する方法です。特定の条件で削除する方法と、リストの中身を全て削除する方法があります。

スポンサーリンク

リスト内にある特定の要素を指定して削除する方法

リスト内の特定の要素を指定して削除する方法は4つあります。

  • 要素を指定して削除(Removeメソッド)
  • インデックスを指定して削除(RemoveAtメソッド)
  • インデックスの範囲指定で削除(RemoveRangeメソッド)
  • 要素を検索して削除(RemoveAllメソッド)

この4つの方法でリスト内の特定の要素を削除することが可能です。

サンプルで次の画面を用意しました。

  1. 左のテキストボックスに削除前のリストの中身を表示
  2. 実行ボタンをクリック
  3. 右のテキストボックスに削除後のリストの中身を表示

という簡単な仕様です。

要素を指定して削除(Removeメソッド)

リストの中の特定の要素を指定して削除する方法です。

ListクラスのRemoveメソッドを使用します。

Removeメソッドは、リストの先頭から要素を探し、引数で指定した値と一致する最初の要素を削除してくれます。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //要素指定で削除
    strList.Remove("名古屋");

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

これを実行すると、次の結果になります。

ただし1つだけ注意が必要です。Removeメソッドの引数で指定した値に対して、リスト内で一致する全ての要素を削除してくれるわけではありません。

引数で指定した要素がリスト内に複数ある場合、一番最初の要素のみを削除するだけです。例えば、上記のサンプルコードで「名古屋」という要素が2つ存在する場合、次の様な結果になります。

左側のテキストボックスで「新横浜」の次にある「名古屋」は削除されてますが、末尾の「名古屋」は削除されていません。

引数で指定した要素がリスト内に複数あり、その要素を全て削除したい場合は、後述するRemoveAllメソッドを利用して下さい。

インデックスを指定して削除(RemoveAtメソッド)

リストの中のインデックスを指定して削除する方法です。

ListクラスのRemoveAtメソッドを使用します。

RemoveAtメソッドは、引数に指定したインデックスの要素を削除します。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //インデックス指定で削除
    strList.RemoveAt(1);

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

これを実行すると次の結果になります。

インデックスの1(リスト内の2番目の要素)が削除されます。

インデックスの範囲指定で削除(RemoveRangeメソッド)

リストの中のインデックスを範囲指定して削除する方法です。

ListクラスのRemoveRangeメソッドを使用します。

RemoveRangeメソッドは、引数で指定した範囲にあるインデックスの要素を削除します。

RemoveRangeメソッドの引数は、

  • 第1引数:インデックスの値(何番目から)
  • 第2引数:削除対象の要素数(何個)

となっています。

例えば、「リストの2番目から3個削除したい」場合は、

objList.RemoveRange(1,3);

と記述します。実際にサンプルコードを見てみましょう。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //インデックスの範囲指定で削除
    strList.RemoveRange(1, 3);

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

実行してみると、次の結果になります。

実行前のテキストボックスを見ると、2~4番目の要素が削除されています。

RemoveRange(1, 3)で実行したので、

  1. 東京(インデックス:0)
  2. 品川(インデックス:1)←削除(第1引数で指定した削除開始インデックス番号)
  3. 新横浜(インデックス:2)←削除(第2引数で指定した範囲内)
  4. 名古屋(インデックス:3)←削除(第2引数で指定した範囲内)
  5. 京都(インデックス:4)
  6. 新大阪(インデックス:5)

となりました。

要素を検索して削除(RemoveAllメソッド)

リストの中の要素を検索して削除する方法です。

ListクラスのRemoveAllメソッドを使用します。

RemoveAllメソッドの引数に検索方法を指定すると、対象になった要素が全て削除されます。

「All」という文字で要素の全てを消してくれると勘違いする場合があるので気を付けましょう。

ではサンプルコードです。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //要素を検索して削除
    strList.RemoveAll(listItem => listItem.Contains("新"));

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

実際に実行すると、次の結果になります。

strList.RemoveAll(listItem => listItem.Contains("新"));

と指定したので、「新」という文字が含まれる要素が削除されています。

RemoveAllメソッドの引数には検索方法を指定する必要があり、いくつか方法があります。

  • 完全一致で要素を全て削除:RemoveAll(listItem => listItem == “名古屋”)
  • 部分一致で要素を全て削除:RemoveAll(listItem => listItem.Contains(“新”))
  • 文字列の長さを指定して削除:RemoveAll(listItem => listItem.Length < 2)

などなど。次の構文を知っておけば大丈夫です。

RemoveAll(listItem => ○○)

構文の「listItem =>」の部分は固定で、「○○」の部分に検索条件を記述します。

尚、上記は全てString型のリストの例なので、数値でも同じことが可能です。

尚、RemoveAllメソッドの引数で、本記事ではlistItemとしています。
これは何でも大丈夫で、「aaaa」とか「hoge」でも動きます。
スポンサーリンク

リストにある全ての要素を削除する方法

リストに入っている全ての要素を容赦なく削除する場合、方法は2つあります。

  • Clearメソッドを使用
  • newして初期化

この2つです。

Clearメソッドを使用

リストの全ての要素を削除する場合、ListクラスのClearメソッドを使用する方法があります。

その名の通り、全ての要素を削除してくれます。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //全て削除(Clear)
    strList.Clear();

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

これを実行すると、次の結果になります。

リストの中身はありませんね。

スポンサーリンク

newして初期化

リストをnewして初期化してもリストの中身を全て削除可能です。

private void cmdDelete_Click(object sender, EventArgs e)
{
    //リスト生成
    List strList = new List();
    strList.Add("東京");
    strList.Add("品川");
    strList.Add("新横浜");
    strList.Add("名古屋");
    strList.Add("京都");
    strList.Add("新大阪");

    //リストの中身を実行前のテキストボックスに表示
    ListVeiw(strList,txtBefore);

    //全て削除(newしてリストを初期化)
    strList = new List<string>();

    //リストの中身を実行後のテキストボックスに表示
    ListVeiw(strList, txtResult);
}

//リストの中身を表示するメソッド
private void ListVeiw(List strList,TextBox objTextBox)
{
    //リストを表示
    foreach (string strTemp in strList)
    {
        objTextBox.Text = objTextBox.Text + strTemp + Environment.NewLine;
    }
}

こちらも先ほどと同じで、画面上では次の結果になります。

見事に削除されていますね。削除というよりも初期化なので、作り直したと表現する方が正しいです。要素の他に、リスト操作の際に設定される情報(Capacityプロパティ等)も完全に消えてます。

スポンサーリンク

参考サイト

List<T>.Remove(T) メソッド (System.Collections.Generic)

List<T>.RemoveAt(Int32) メソッド (System.Collections.Generic)

List<T>.RemoveRange(Int32, Int32) メソッド – Microsoft Docs

List<T>.RemoveAll(Predicate<T>) メソッド – Microsoft Docs

List<T>.Clear メソッド (System.Collections.Generic)