MinBy, MaxBy を Aggregate で代用する

リストの要素から、ある特定のキーで最小の値を持つものを取得したい場合があります。

Ruby では、Enumerable#min_by メソッドを使うと、そのような要素を簡単に取得できます。

C# には、そのものずばりのメソッドは標準ライブラリにはないのですが、Enumerable.Aggregate を使えば、 目的の機能を実装できます。

using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static void Main() {
        var xs = new List<int[]> {
            new[] { 1, 2 },
            new[] { 20, 50 },
            new[] { 30, 22 },
            new[] { 50, -100 },
        };

        // MinBy : 1 番目の要素が最小のものを返す。
        var y = xs.Aggregate((a, b) => a[1] < b[1] ? a : b);
        Console.WriteLine(string.Join(" ", y)); // 50 -100

        // MaxBy : 1 番目の要素が最大のものを返す。
        var x = xs.Aggregate((a, b) => a[1] > b[1] ? a : b);
        Console.WriteLine(string.Join(" ", x)); // 20 50
   }
}

最小(最大)の要素を持ち回すイメージです。

実行結果です。

20 50
50 -100