【C#】List型とLINQ(Whereメソッド)

スポンサーリンク

LINQ(リンク)を使いこなす第1弾です。
条件に一致した要素を取得するメソッドを紹介します。
Whereメソッドです。
この記事では、メソッド構文で紹介します。
クエリ構文は補足として最後に紹介しようと思います。

Whereメソッド

データソースをフィルターするために使用するWhereメソッドです。
早速、サンプルを紹介していきます。

リストクラスに準備されているFindAllメソッドと類似しています。
FindAllメソッドについては下記記事を参考にしてください。
【C#】リスト型とラムダ式(Find/FindAll) | 育児パパの人生備忘録 (t19488sns.com)

候補の値と一致した要素を取得する

例えば、『リストの要素の中に指定した配列と一致する要素を抽出』するパタンを想定します。
これをメソッド構文で記載します。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

List<int> lstResult = lstSample.Where(x => new int[] { 1, 2, 3 }.Contains(x)).ToList();
lstResult.ForEach(i => Console.WriteLine(i));   //結果:1,2

定義したリストの中に候補の数値[1,2,3]があるかを確認し、その要素を取得します。
サンプルでは、配列にしましたが、リスト型でも問題はありません。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };
List<int> lstFilter = new List<int> { 4, 5, 6 };

List<int> lstResult = lstSample.Where(x => lstFilter.Contains(x)).ToList();
lstResult.ForEach(i => Console.WriteLine(i));   //結果:4

指定した範囲と一致した要素を取得する

例えば、『指定した数値以上の要素を取得』or『指定した数値以下の要素を取得』or『指定の範囲内の要素を取得』するといった条件に一致している要素をすべて取得します。

サンプルとして『指定した数値(=5)以下の要素を取得』したいと思います。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

List<int> lstResult = lstSample.Where(x => x <= 5).ToList();
lstResult.ForEach(i => Console.WriteLine(i));   //結果:4,1,2

ラムダ式の右辺には条件を記載する為、条件分岐(IF文)のように複数入力する事が可能です。
サンプルとして『指定した数値(=2)以上 かつ 指定した数値(=10)以下の要素を取得』を行います。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

List<int> lstResult = lstSample.Where(x => 2 <= x && x <= 10).ToList();
lstResult.ForEach(i => Console.WriteLine(i));   //結果:4,2,8

条件が「かつ(And)」の時は、Whereメソッドを重ねる事でも同じ結果になります。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

List<int> lstResult = lstSample.Where(x => 2 <= x).Where(x => x <= 10).ToList();
lstResult.ForEach(i => Console.WriteLine(i));   //結果:4,2,8

まとめ

今回はWhereメソッドを使って、リストクラス内の要素から条件に一致した要素を取得する方法を紹介しました。FindAll()を使っても同じことは可能です。
どちらを選択するかは自由です。

個人的な見解ですが、
今回のサンプルのようにListクラスの中がint型である時は、
Listクラスに標準的に準備されているメソッドFindAll()の方が戻り値が同じListクラスになる為、使いやすいと思います。
Listクラスの中が構造体やクラスになってくると、組み合わせて実行する機会が増えると予想されるのでLINQを使った方がいい場合が出てくると思いますね。

補足(クエリ構文)

今回紹介したサンプルはメソッド構文だったので、クエリ構文で書いた場合どうなるかを紹介します。
クエリ構文で書く時は、Where句と言うらしいです。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

//候補値から抽出
Console.WriteLine("sampleQuery1");
var sampleQuery1 = from x in lstSample 
                   where (new int[] { 1, 2, 3 }.Contains(x))
                   select x;
foreach (var q in sampleQuery1) Console.WriteLine(q);   //結果:1,2

//条件から抽出(5以下)
Console.WriteLine("sampleQuery2");
var sampleQuery2 = from x in lstSample
                   where x <= 5
                   select x;
foreach (var q in sampleQuery2) Console.WriteLine(q);   //結果:4,1,2

//条件から抽出(2以上10以下)
Console.WriteLine("sampleQuery3");
var sampleQuery3 = from x in lstSample
                   where 2 <= x && x <= 10
                   select x;
foreach (var q in sampleQuery3) Console.WriteLine(q);   //結果:4,2,8

//条件から抽出(2以上10以下) その2
Console.WriteLine("sampleQuery4");
var sampleQuery4 = from x in lstSample
                   where 2 <= x 
                   where x <= 10
                   select x;
foreach (var q in sampleQuery4) Console.WriteLine(q);   //結果:4,2,8

クエリ構文で書く場合は、from句から始まります
そして、他の句を組み合わせて、最後にselect句/group句で締める必要があります。
1行で書いてもいいのですが、分かりやすいように各句ごとに改行を入れています。

コメント

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