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