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()では全ての要素が条件を一致しているかの取得。
リスト型の要素内で条件を満たす有無を知りたいだけであれば、使えるでしょう。
その時に、ラムダ式で書く方がコードがスッキリしていいと思います。
ただ書き方の問題なので、正しいとか正しくないという考えは不要だと思っています。
知っている人と知らない人がいるだけの世界。
知っている人は、標準で準備されているメソッドを使用する事は多いです。
その時に、読み解けるようになる事が一番重要だと思っています。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント