C#のLinqを使ってみる(1)

こんにちは。きわさです。

今回はC#のLinqについてです。
C#で配列やリストを扱うときにLinqが便利です。

例えば

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var newList = new List<int>();

foreach(var num in list) 
{
    if ((num % 2) == 0) {
        newList.Add(num);
    }
}

のように、元のリスト(list)から特定の要素のみに絞った新しいリスト(newList)を作りたい場合など、Linqでは次のように書けます。

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var newList = list.Where(num => (num % 2) == 0).ToList();

一行になりました。
ポイントは .Where(num => (num % 2) == 0) で、これは
listの各要素(num)に対して(num % 2) == 0 で判定し、trueとなるものに絞ります。
(num % 2) == 0 の部分は何でもよく、boolを返すものであれば関数でも構いません。

例えば、次のように書けば、listの各要素で Test()の結果がfalseになるもののみに絞ることができます。

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var newList = list.Where(num => !Test(num)).ToList();

他にも、boolであればよいでの、条件を複数書くこともできます。

var list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var newList = list.Where(num => (num > 4) &&
                                (num < 8))
                  .ToList();

とすれば、4より大きく、8より小さい要素に絞ることができます。

少し応用すると次のようなこともできます。
とあるクラスに日付のリストがあり、GetListメソッドで年月日を指定して該当する日付のリストを取得します。

private List<DateTime> list = new List<DateTime>() 
{
    new DateTime(2018, 1, 1),
    new DateTime(2018, 1, 2),
    new DateTime(2018, 1, 3),
    new DateTime(2018, 1, 4),
    new DateTime(2018, 2, 1),
    new DateTime(2018, 3, 1),
    new DateTime(2018, 4, 1),
    new DateTime(2018, 4, 2),
};

public List<DateTime> GetList(int? year, int? month, int? day) 
{
    return this.list.Where(d => (!year.HasValue || year.Value == d.Date.Year) &&
                                (!month.HasValue || month.Value == d.Date.Month) &&
                                (!day.HasValue || day.Value == d.Date.Day))
                    .ToList();
}

GetListの引数の年月日は int? となっており、Whereの条件も
!year.HasValue || year.Value == d.Date.Year のようになっています。
これは 指定した場合は該当するものに絞り、指定しない(null)場合は絞らない ということです。

GetList(2018, null, null)とすれば、2018年の要素すべて、
GetList(null, null, 1)とすれば、年月を問わず1日の要素すべて、
となります。

今回はここまでです。
LinqのWhereについてでしたが、いかがでしたでしょうか。
ぜひ使ってみてください。

スポンサーリンク