Several weeks ago, I posted this bit of code that shows how
we might use a
C# 3.0 query expression to calculate the sum of the squares of an array of
integers.
static void Main()
{
var numbers = new int[]
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
var sum = (from n in numbers
where (n % 2) == 0
select
n * n).Sum();
Console.WriteLine("Sum: {0}", sum);
}
Translating this sample into Visual Basic 9.0 produces almost identical code.
Sub Main()
Dim numbers() = New Integer()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Dim total = (From n In numbers _
Where (n Mod 2) = 0 _
Select
n * n).Sum()
Console.WriteLine("Sum: {0}", total)
End Sub
However, this translation is a bit naive because Visual Basic 9.0 actually
provides syntax
for more of the standard query operators than C# 3.0 does. While we have to call the
"Sum" query operator explicitly in C#, Visual Basic allows us to use
it
directly in the query.
Sub Main()
Dim numbers() = New Integer()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Dim total = Aggregate n In numbers _
Where (n Mod 2) = 0 _
Select n * n _
Into
Sum()
Console.WriteLine("Sum: {0}", total)
End Sub
In fact, Visual Basic even allows us to create our own aggregate functions
and use them directly in query expressions.
<Extension()> _
Function Product(ByVal source As IEnumerable(Of Integer)) As Integer
Dim result = 1
For Each n In source
result *= n
Next
Return result
End Function
Sub Main()
Dim numbers() = New Integer()
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Dim total = Aggregate n In numbers _
Where (n Mod 2) = 0 _
Select n _
Into
Product()
Console.WriteLine("Sum: {0}", total)
End Sub
Here we get the product of the even numbers in the array. (I removed the
expression to square each even number because it produced an OverflowException.)
I should point out that there is a behavioral difference that the Visual
Basic "Aggregate" keyword introduces. A standard "From" query expression is
delay evaluated. That is, the results aren't actually evaluated until they are
accessed through, say, a "For Each" loop. However, an "Aggregate" query
expression forces the results to be evaluated immediately. In
contrast, C# 3.0 query expressions always produce results that are
delay evaluated.1
1A bold statement that will be
completely recanted if any reader can find an example that proves otherwise.2
2Please, prove me wrong. Seriously. I'm interested in this stuff.3
3This footnote motif is clearly ripped off from
Raymond Chen.