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

スポンサーリンク

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

Findメソッド

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

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

今までの自分なら。。。

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

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

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

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

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

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

解説

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

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

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

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

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

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

FindAllメソッド

FindAllメソッドでは、リスト内にある要素を検索し、条件に一致した要素をすべて出力します。
その為、FindAllメソッドでの戻り値はリスト型になります。
前回同様に数字のリストを作ってみます。
数字のリストから、5以上の数値】をFindAllメソッドを使って抽出します。

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

今までの自分なら。。。

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
List<int> values = new List<int>();
foreach(int i in lstSample)
{
    if(5 <= i)
    {
        values.Add(i);
    }
}
values.ForEach(i => Console.WriteLine(i));   //結果:[8 ,16]

foreachでループを回しながら、条件を探して、一致したのもをリストに登録するようなフローを書いていました。

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

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

List<int> lstSample = new List<int> { 1, 2, 4, 8, 16 };
List<int> values = lstSample.FindAll(i => 5 <= i);
values.ForEach(i => Console.WriteLine(i));   //結果:[8 ,16]

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

解説

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

戻り値の型はList<int>になります。これは、FindAll()した方と同じ型が戻り値として返ってきます。

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

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

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

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

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

まとめ

今回は、リスト型から条件に一致した要素を抽出する方法をラムダ式で紹介しました。
注意してほしい内容としては、Find()では最初の要素を1つだけ抽出。
そして、FindAll()ではすべての要素を抽出します。
リスト型の要素を抽出したい時は頻度として多いでしょう。
その時に、ラムダ式で書く方がコードがスッキリしていいと思います。

コメント

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