[C# LINQ] Whereメソッドで条件を満たす要素だけを取り出す

LINQのWhereメソッドについての説明です。
LINQってなに?という方は、[C# 入門] LINQってなに?LINQでできることを見てください。

スポンサーリンク

Whereメソッドでできること

LINQのWhereメソッドを使うと、配列・コレクションなどから条件に一致した要素のみを抽出することができます。

Whereメソッドは遅延評価になります。実際に結果が必要になった時にメソッドが実行されます。

スポンサーリンク

Whereメソッドで要素を抽出する

では、Whereメソッドを使ってみましょう。
下のサンプルは、SampleDataクラスのリストから条件に一致するデータを抽出しています。

Whereメソッドの引数には、抽出する条件を判定するメソッドを指定します。各要素に対して指定したメソッドが実行されます。

抽出する条件を判定するメソッドの引数はデータソースの要素のデータ型になります。サンプルの場合は引数はSampleDataクラス型です。
戻り値はBoolean型です。Trueが返ってきた要素が抽出されます。

ラムダ式を使って匿名関数を渡すと簡単にWhereに引数を指定することができます。
ラムダ式?という方は、[C# 入門] 匿名関数(ラムダ式)の使い道を見てください。

LINQを使うには、ソースコードの先頭にusing System.Linq;を追加します。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // SampleDataクラスのリストの宣言と初期化
        List<SampleData> list = new List<SampleData> { 
            new SampleData { Data1 = 1, Data2 = 2, },
            new SampleData { Data1 = 10, Data2 = 20, },
            new SampleData { Data1 = 100, Data2 = 200, },
        };
        // Whereメソッドで必要な要素だけを抽出する
        var where_list = list.Where(d => {
            // 各要素を判定して、True or False を返す
            return d.Data1 >= 10;
        });

        // 結果を表示
        Console.WriteLine($"抽出した件数={where_list.Count()}");
        foreach (var d in where_list) {
            Console.WriteLine($"Data1={d.Data1}, Data2={d.Data2}");
        }

        // 必要に応じて、配列・リストに変換
        var list2 = where_list.ToList(); // Listに変換
        var ary = where_list.ToArray();  // 配列に変換 
    }
}

class SampleData 
{ 
    public int Data1 { get; set; }
    public int Data2 { get; set; }
}

実行結果はこんな感じです。Data1が10以上の要素が抽出されました。

抽出した件数=2
Data1=10, Data2=20
Data1=100, Data2=200

Whereメソッドの戻り値はIEnumerable<T>型のコレクションになります。Tの部分はデータソースの要素のデータ型になります。サンプルの場合、TはSampleDataクラス型になります。

IEnumberable型なのでforeachinに指定することができます。(22行目)

また、必要に応じて、ToListメソッドを使いListに変換したり、ToArraryメソッドを使い配列に変換することができます。(27、28行目)

スポンサーリンク

抽出対象か判定する際に要素のインデックスを取得する

Whereメソッドにはもう一つ、要素のインデックスを取得できるオーバーロードがあります。

Whereメソッドの引数に、各要素のデータ型と要素のインデックス(int型)を持つメソッドを指定すると要素のインデックスを取得することができます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // SampleDataクラスのリストの宣言と初期化
        List<SampleData> list = new List<SampleData> { 
            new SampleData { Data1 = 1, Data2 = 2, },
            new SampleData { Data1 = 10, Data2 = 20, },
            new SampleData { Data1 = 100, Data2 = 200, },
        };
        // Whereメソッドで必要な要素だけを抽出する
        var where_list = list.Where((d, i) => {
            // 各要素を判定して、True or False を返す
            return d.Data1 >= 10 && i == 1;
        });

        // 結果を表示
        Console.WriteLine($"抽出した件数={where_list.Count()}");
        foreach (var d in where_list) {
            Console.WriteLine($"Data1={d.Data1}, Data2={d.Data2}");
        }
    }
}

class SampleData 
{ 
    public int Data1 { get; set; }
    public int Data2 { get; set; }
}
抽出した件数=1
Data1=10, Data2=20

15行目の i が要素のインデックスです。


C# プログラミング講座に戻る

コメント

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