Quantcast
Channel: ソフラボの技術ブログ
Viewing all articles
Browse latest Browse all 166

LINQでグルーピングした最大の要素を取得する

$
0
0

C#でグルーピングして最大の要素を取得したかったので、試行錯誤して調べた結果、MaxではなくOrderByDescendingを使うことで実現できました。

まだまだLINQは、使い慣れてないのでちょっと特殊なことをしようとするとハマって時間が取られてしまいました…。そんなんでお困りの方、ご参考に。

少し解説すると、以下のようになります。
GroupBy
・第1引数:元の値を何でグループ化するかを指定する
・第2引数:元の値をグループ化したものに対して、キーと値の2つの引数が使え、値に対しての処理を指定する

OrderByDescending
元の値を第1引数で指定したもので昇順に並べ、Firstを指定することで先頭を取得する

サンプルコード

// 値を持つクラスpublicclass Hoge
{
    publicint Key { get; set; }

    publicstring Dt { get; set; }
}

// グルーピングして最大を取得する処理publicvoid Main(string[] args)
{
    // 値の設定
    List<Hoge> list = new List<Hoge> {
	new Hoge() { Key = 1, Dt = "20190101" },
	new Hoge() { Key = 1, Dt = "20190102" },
	new Hoge() { Key = 2, Dt = "20190101" },
	new Hoge() { Key = 3, Dt = "20190310" },
	new Hoge() { Key = 3, Dt = "20190305" },
	new Hoge() { Key = 3, Dt = "20190301" },
	new Hoge() { Key = 4, Dt = "20190101" },
	new Hoge() { Key = 4, Dt = "20190102" },
	new Hoge() { Key = 5, Dt = "20190103" },
    };

    // Key毎にDtが最大の要素を取得
    List<Hoge> retList = list
	.GroupBy(
	    h => h.Key,
	    (k, v) => v.OrderByDescending(o => o.Dt).First())
	.ToList();

    // 結果
    retList.ForEach(f => Console.WriteLine("{0} {1}", f.Key, f.Dt));
}

結果

120190102220190101320190310420190102520190103

Key毎にDtが最大の要素がListに格納されています。


Viewing all articles
Browse latest Browse all 166

Trending Articles