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

スポンサーリンク

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

FindIndexメソッド

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

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

今までの自分なら。。。

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

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

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

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

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

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

解説

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

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

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

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

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

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

開始位置や検索範囲を指定する

このFindIndex()では、範囲を指定する事が出来ます。
1つ目は、開始位置の指定です。

スタートインデックスを指定する事で、指定分のインデックスをスキップする事で出来ます
サンプルの場合、[startIndex=1]であるので、lstSample[1]から検索する事になります。

次は、範囲の指定です。
※これは、開始のインデックスを指定する必要があります。

スタートインデックスから指定の個数分検索する事になります。
サンプルの場合は、[startIndex=1][count=2]の為、lstSample[1]からlstSample[2]までを検索する事になります。

startIndex:検索開始位置
count:検索範囲

引数の数値がインデックスを超えるような数値を入力している場合、System.ArgumentOutOfRangeExceptionが発生する。

FindLastIndexメソッド

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

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

今までの自分なら。。。

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

for文でループを回しながら、条件を探して、一致した要素のインデックスを変数[Indx]に代入します。
最後までループが回ることで、最後に条件が一致したインデックス値を取得する事が出来ます。

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

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

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

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

解説

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

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

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

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

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

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

開始位置や検索範囲を指定する

FindIndex()同様に、FindLastIndex()でも開始位置や検索範囲を指定する事は可能です。
同じ内容なので、割愛します。

ここをクリックすると、書いてある行へスキップできます。

まとめ

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

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

コメント

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