Estive vendo como funcionam as Lambda Expressions no VB.NET. Para testar, criei uma instancia da classe List(Of T) e adicionei nomes dentro dela. Em seguida, utilizei o método ForEach para iterar por essa coleção, onde em cada item eu gostaria de escreve-lo na tela. Inicialmente o código foi:
Dim nomes As New List(Of String)
nomes.Add(“Israel”)
nomes.Add(“Claudia”)
nomes.Add(“Juliano”)
nomes.Add(“Virginia”)
nomes.ForEach(Function(n) Console.WriteLine(n))
Ao compilar, aparece a seguinte mensagem de erro: Expression does not produce a value. O que aparentemente faz sentido. No Visual Basic, quando queremos que um método retorne um valor, então o criamos como Function. O comportamento desta keyword nas Lambda Expressions tem o mesmo comportamento, ou seja, obrigatoriamente ela precisa retornar algum valor que, neste caso, não ocorre. Se, ao invés de utilizar o método ForEach, utilizar o método Find que, por sua vez, retorna o nome caso o mesmo seja encontrado dentro da coleção, então eu poderia fazer o uso da Lambda Expressions sem problemas:
Dim resultado = nomes.Find(Function(n) n = “Israel”)
Há uma alternativa para utilizar uma Lambda Expression para o método ForEach e outros métodos que não retornam valor mas, na minha opinião, perde toda a elegancia destas expressões. Exemplo:
nomes.ForEach(Function(n) Write(n))
Function Write(ByVal nome As String) As String
Console.WriteLine(nome)
Return Nothing
End Function
Já no C#, podemos utilizar o operador => para ambos os casos:
nomes.ForEach(n => Console.WriteLine(n));
var resultado = nomes.Find(n => n == “Israel”);