【C#】リスト型とラムダ式(RemoveAll)

スポンサーリンク

List型(Listクラス)を使いこなそう第6弾です。
今回紹介するのは「RemoveAllメソッド」です。

RemoveAllメソッド

RemoveAllメソッドでは、リスト内の要素で条件に一致した要素を削除します。
前回同様に数字のリストを作ってみます。
数字のリストから、5以上の数値】をRemoveAllメソッドを使って削除します。

RemoveAllメソッドを知らない、ラムダ式を分からない人の場合

今までの自分なら。。。

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
for (int idx = 0; idx < lstSample.Count; idx++)
{
    if (5 <= lstSample[idx])
    {
        lstSample.RemoveAt(idx);
        idx--;
    }
}
lstSample.ForEach(i => Console.WriteLine(i));   //結果:1,2,4 

ループを回して、条件が一致した時は、そのインデックス番号を削除します。
削除したことで要素数に変化があったので、辻褄を合わせるためにインデックスをデクリメントします。

RemoveAllメソッドを使い、ラムダ式ができる人の場合

これをExistsメソッドを使って、ラムダ式が出来る人は。。。

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
int res = lstSample.RemoveAll(i => 5 <= i);
Console.WriteLine("削除した要素数:" + res);   //結果:2
lstSample.ForEach(i => Console.WriteLine(i));   //結果:1,2,4 

先ほどの処理に比べると、ループ処理やインデックスの考慮をしなくていい分スッキリします。
仮に【すべての要素が条件に一致しない】場合は、「res = 0」となります。
※削除した要素数は、必要なのか分かりませんが。。。

解説

(リスト型).RemoveAll()のRemoveAll部分にマウスを持っていくと、説明がでてきます。

引数には、Predicate<int>が必要だと書いています。
< 戻り値[ int型 ] & 引数[ Pridicate<int型> ]の関数>が必要だと書いています。
[Predicate]は条件を満たしているか判断するメソッドです。

ラムダ式の書き方については、下記記事を参考にしてください。
【C#】ラムダ式の使い方(書き方) | 育児パパの人生備忘録 (t19488sns.com)

今回の場合は、ラムダ式で書く場合、《 左辺:引数 => 右辺:式 》という事から、こうなります。

左辺(引数):int型の名前 i ※名前なので任意
右辺(式) :iが5以上(i <= 5)

まとめ

今回は、リスト型から条件に一致した要素の削除をラムダ式で紹介しました。
注意してほしい内容としては、RemoveAll()では条件を満たす要素は削除されます。
ループ分を使ってコードを書くと要素数を考慮しないといけません。
その為、コードも読む人からすると「一瞬何してるの?」って思われる可能性はあります。
その時に、ラムダ式で書く方がコードがスッキリしていいと思います。

ただ書き方の問題なので、正しいとか正しくないという考えは不要だと思っています。
知っている人と知らない人がいるだけの世界。
知っている人は、標準で準備されているメソッドを使用する事は多いです。
その時に、読み解けるようになる事が一番重要だと思っています。

コメント

タイトルとURLをコピーしました