VB LINQ の Aggregate 文

昨日のわんくま勉強会で出てた話。VBLINQ では 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 は次期版で仕様を変えてくれたりするんでしょうか。