【C#】リスト型とラムダ式(Exists/TrueForAll)

スポンサーリンク

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

Existsメソッド

Existsメソッドでは、リスト内にある要素を検索し、1つでも条件に一致した要素の有無を出力します。
前回同様に数字のリストを作ってみます。
数字のリストから、5以上の数値】をExistsメソッドを使って取得します。

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

今までの自分なら。。。

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
bool res = false;
foreach (int i in lstSample)
{
    if (5 <= i)
    {
        res = true;
        break;
    }
}
Console.WriteLine(res);   //結果:True

ループを回しながら、条件を探して、ループを抜けるようなフローを書いていました。

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

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

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
bool res = lstSample.Exists(i => 5 <= i);
Console.WriteLine(res);   //結果:True

ループの処理を1行で済ますことが出来ました。
仮に【すべての要素が条件に一致しない】場合は、「res = false」となります。

解説

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

引数には、Predicate<int>が必要だと書いています。
[Predicate]です。
これは[Action]や[Func]同様に[delegate]の中で標準ライブラリに準備されているクラスです。
もう少しかみ砕きましょう。
引数には、< 戻り値[ bool型 ] & 引数[ int型 ]の関数>が必要だと書いています。
[Predicate]は条件を満たしているか判断するメソッドです。

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

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

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

内部的には、for分と同じフローで動作していると考えられます。
図で書くとこんな感じですかね。。。

TrueForAllメソッド

TrueForAllメソッドでは、リスト内にある要素を検索し、全ての要素が条件に一致したしたかどうかを出力します。
先ほどのサンプルと同じように数字のリストを作ってみます。
数字のリストから、5以上の数値】をTrueForAllメソッドを使って取得します。

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

今までの自分なら。。。

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
bool res = true;
foreach (int i in lstSample)
{
    if (!(5 <= i))
    {
        res = false;
        break;
    }
}
Console.WriteLine(res);   //結果:False

for文でループを回しながら、条件を探して、不一致した要素を見つけた時にFalseをリターンするフローを書いていました。
最後までループが回ることで、全ての要素が条件を一致したと言う事になります。

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

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

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
bool res = lstSample.TrueForAll(i => 5 <= i);
Console.WriteLine(res);   //結果:False

ループの処理を1行で済ますことが出来ました。
仮に【1つでも条件が一致】場合は、「res = False」となります。

解説

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

戻り値の型はboolになります。
引数には、Predicate<int>が必要だと書いています。
これは[Action]や[Func]同様に[delegate]の中で標準ライブラリに準備されているクラスです。
もう少しかみ砕きましょう。
引数には、< 戻り値[ bool型 ] & 引数[ int型 ]の関数>が必要だと書いています。
[Predicate]は条件を満たしているか判断するメソッドです。

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

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

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

図で書くとこんな感じですかね。。。

まとめ

今回は、リスト型から条件に一致した要素の有無/すべての要素が一致しているかをラムダ式で紹介しました。
注意してほしい内容としては、Exists()では要素内で1つでも条件を満たす要素の有無を取得。
そして、TrueForAll()では全ての要素が条件を一致しているかの取得。
リスト型の要素内で条件を満たす有無を知りたいだけであれば、使えるでしょう。
その時に、ラムダ式で書く方がコードがスッキリしていいと思います。

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

コメント

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