VB LINQ の Aggregate 文
昨日のわんくま勉強会で出てた話。VB の LINQ では from だけじゃなくて aggregate 文があるってんだけど、それのコンパイル結果はどうなるんだろうという。
Dim array As Integer() = {1, 2, 3, 4, 5} Dim result = Aggregate x In array Into Max = Max(), Min = Min(), Ave = Average(), Count = Count(x < 3)
で、これ、コンパイル結果を見てると、以下の C# コードとほぼ同じ意味に展開されるみたい。
int[] array = { 1, 2, 3, 4, 5 }; var result = new { Min = array.Min(), Max = array.Max(), Ave = array.Average(), Count = Count(x => x < 3) };
要するに、array. とか x => が省略できるだけ。2重 from から SelectMany への変換みたいに、これを使わないと書きづらい式ってあるんだろうか。でないと、With 文と大差ない機能かなぁ。
上記の Aggregate の結果が
int count = 0; int min = int.MaxValue; int max = int.MinValue; double average = 0; foreach (var x in array) { min = x < min ? x : min; max = x > max ? x : max; average += x; } average /= count; return new { Min = min, Max = max, Ave = average };
みたいなものに展開されるんなら Aggregate 構文すげーって思うけども・・・
ひょっとしたら C# 4.0 になって動的コード生成機能が C# に追加されたら、こういうコード生成機能も付くかもしれないけど。逆に、現時点で Aggregate 文を上述のような実装方法で追加してしまった VB は次期版で仕様を変えてくれたりするんでしょうか。