C# - リスト(List)の要素を削除する

リスト(List)の内容を削除するメソッドとして、Remove、RemoveAll、RemoveAt、Clear メソッドが用意されています。

// Listの初期化
var list = new List<string> { "item1", "item2", "item1" };


// 最初に見つかった "item1" を1件削除
list.Remove("item1");

// "item1" を全て削除
list.RemoveAll(value => value == "item1");

// "item1" 以外を全て削除
list.RemoveAll(value => value != "item1");

// 文字数が10文字以下の値を全て削除
list.RemoveAll(value => value.Length <= 10);

// リスト0番目(先頭) の要素を削除
list.RemoveAt(0);

// 全ての要素 を削除
list.Clear();

Removeメソッド(最初に見つかった1件を消す)

Remove メソッドは引数に渡された値に一致する要素を削除します。戻り値は bool 型で、削除できた場合に true を返します。最初の1件しか削除されないので注意が必要です。

Removeメソッド の使い方

bool 結果(true:消せた or false:消せなかった) = list.Remove(消したい値);

Removeメソッド の使用例

次のサンプルコードは リストから 文字列 "item1" を削除しています。最初の1件しか削除されないので、結果は["item2", "item1"]です。
using System.Collections.Generic;

// リストの初期化
var list = new List<string> { "item1", "item2", "item1" };

// Removeメソッドで "item1" を削除
bool result = list.Remove("item1");

// Removeメソッドの戻り値 = true(true:削除できた)
System.Console.WriteLine($"result -> {result}");

// 削除結果を表示
foreach (var item in list)
{
    // 結果 = "item2", "item1"
    System.Console.WriteLine(item);
}
サンプルコードの実行結果
サンプルコードの実行結果

RemoveAllメソッド(条件に一致する値を全て消す)

RemoveAll メソッドは「デリゲート(英: delegate)」と呼ばれる仕組みで動作します。 引数に渡すのは関数で、この関数はリストの件数分呼ばれます。関数にリスト内の値が渡されるので、消したい値の場合は戻り値 true を返します。

RemoveAllメソッド の使い方

static bool デリゲート関数(listの型 value) {
    return true(削除する) または false(削除しない);
}

int 削除件数 = list.RemoveAll(デリゲート関数);

無名関数(ラムダ式)

RemoveAll メソッドは無名関数と組み合わせて使用することが多いです。無名関数とは、その名の通り、関数名のない関数です。
// "item1" を全て削除
list.RemoveAll(value => value == "item1");

// "item1" 以外を全て削除
list.RemoveAll(value => value != "item1");

// 文字数が10文字以下の値を全て削除
list.RemoveAll(value => value.Length <= 10);

RemoveAllメソッド の使用例

次のサンプルコードは RemoveAllメソッド と 無名関数 を使用し、リスト中の "item1" を全て削除します。
using System.Collections.Generic;

// リストの初期化
var list = new List<string> { "item1", "item2", "item1" };

// RemoveAllメソッドで "item1" を全て削除
int result = list.RemoveAll(value => value == "item1");

// RemoveAllの戻り値 = 2(件)
System.Console.WriteLine($"result -> {result}");

// 削除結果を表示
foreach (var item in list)
{
    // 結果 = "item2"
    System.Console.WriteLine(item);
}
サンプルコードの実行結果
サンプルコードの実行結果

RemoveAtメソッド(指定インデックスの要素を1件削除)

RemoveAtメソッドは引数に渡したインデックスの要素を削除します。戻り値はありません。範囲外のインデックスを渡すと例外(ArgumentOutOfRangeException)が発生します。

RemoveAtメソッド の使い方

list.RemoveAt(インデックス);

RemoveAtメソッド の使用例

次のサンプルコードは forループとRemoveAtメソッド を使用し、リスト中の "item1" を全て削除します。リスト先頭から処理すると削除位置がずれるので、リストの最後から処理しています。
using System.Collections.Generic;

// リストの初期化
var list = new List<string> { "item1", "item2", "item1" };

// ループ + RemoveAt メソッドで "item1" を全て削除
for (int i = list.Count - 1; i >= 0; i--)
{
    if (list[i] == "item1")
    {
        list.RemoveAt(i);
    }
}

// 削除結果を表示
foreach (var item in list)
{
    // 結果 = "item2"
    System.Console.WriteLine(item);
}
サンプルコードの実行結果
サンプルコードの実行結果

Clearメソッド(すべての要素を削除)

Clearメソッドはリスト内全ての値を削除します。戻り値と引数はありません。

Clearメソッド の使い方

list.Clear();

Clearメソッド の使用例

次のサンプルコードは Clearメソッド を使用し、リスト中の値を全て削除します。
using System.Collections.Generic;

// リストの初期化
var list = new List<string> { "item1", "item2", "item1" };

// ループ + Clear メソッドで "item1" を全て削除
for (int i = list.Count - 1; i >= 0; i--)
{
    if (list[i] == "item1")
    {
        list.RemoveAt(i);
    }
}

// 削除結果を表示
foreach (var item in list)
{
    // 結果 = "item2"
    System.Console.WriteLine(item);
}

参考資料

検証環境