quarta-feira, 13 de fevereiro de 2013

C# - LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()

Bom, a pedido do Cristiano Carvalho, neste post e nos próximos estarei comentando sobre os métodos LINQ que considero mais importante.

Se tiverem alguma sugestão ou pedido de outros métodos, por favor.


LINQ First(), FirstOrDefault(), Single(), Last(), LastOrDefault()


Neste post falarei sobre os métodos First, FirstOrDefault, Single, Last e LastOrDefault do LINQ, que são muito simples, mas exigem cuidado.
Todos são métodos de busca com uma sobrecarga que permite que seja atribuído um predicado à busca, ou seja, podemos fazer uma busca em uma lista de números inteiros, onde o predicado é: "que seja maior do que 10", por exemplo.
int primeiroNumeroMaiorQueDez = listaDeNumerosInteiros.First(numero => numero > 10);

Apesar dos métodos First e FirstOrDefault fazerem praticamente a mesma coisa, eles tem algumas diferenças, que serão discutidas adiante:

Fizemos um teste, buscando em uma lista de números inteiros, o primeiro elemento com o valor 100, através do método FIRST, sendo que na lista existia tal número.

Teste FIRST em uma lista com o elemento procurado

Em seguida fizemos o mesmo teste, em uma lista que não contém o número 100, o que nos levaria a uma dúvida: "O que o método irá nos retornar então?". A resposta é: "Uma exception".

Teste FIRST em uma lista sem o elemento procurado

Porém, em alguns momentos, gostaríamos de recuperar o elemento procurado apenas se ele existir, e se não existir, queremos que um valor default seja retornado, sem gerar exception, que no caso de uma lista de números inteiros é o número 0.
Neste caso, devemos utilizar o método FIRSTORDEFAULT:

Teste FIRSTORDEFAULT em uma lista sem o elemento procurado

Outro método que busca um elemento em uma lista é o Single, com o diferencial de que tal método, está esperando procurar um elemento único em uma lista, portanto o número de ocorrências do número procurado na lista não pode ser diferente de 1:

Teste SINGLE em uma lista sem o elemento procurado

Teste SINGLE em uma lista com apenas uma ocorrência do número procurado

Teste SINGLE em uma lista com mais de uma ocorrência do número procurado

Os métodos Last e LastOrDefault, se assemelham ao Fist e FirstOrDefault respectivamente, sendo que ao invés de buscarem o primeiro elemento, buscam o ultimo.

Não confunda. Com o método FirstOrDefault, o método First e Single parecem ser inúteis, porém cada um deles tem suas utilidades, por exemplo:
Se quisermos procurar em um cadastro, onde o CPF deve ser único, um usuário que tenha o CPF = 118.187.881-00, qual método usaríamos e porque?

A resposta é: "Single", pois se existir mais de um usuário com o CPF procurado, por alguma falha na lógica do sistema, isso pode gerar um problemão.

Suponha que a intenção de buscar o usuário pelo CPF seja de debitar um valor X de sua conta, gostaria que houvesse uma confusão entre 2 usuários, ou preferiria que uma exception fosse gerada para que sua equipe pudesse analisar o problema?

Bom, espero ter ajudado.

Abaixo disponibilizarei as classes utilizadas. O código-fonte pode ser obtido através do link(source) ou no git:
https://github.com/fsaalmeidinha/LinqFirst_Single_Last.git

TestLinqMethods.cs

Program.cs

Nenhum comentário:

Postar um comentário