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型なのでforeachのinに指定することができます。(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# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント