domingo, 10 de março de 2013

C# - LINQ SelectMany

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 SelectMany()

Neste post falarei sobre um método que conheci a pouco tempo e achei interessante, pois nos permite economizar algumas linhas de código, deixando o mesmo mais legível. Este método é o SelectMany.

Imagine o seguinte cenário:
Temos uma rede de colégios onde cada colégio tem seus professores com suas devidas matérias(matemárica, física, portugues...)
Queremos então selecionar todos os professores que lecionam Matemática.
Para resolvermos esse problema necessitaríamos de 1 loop dentro de outro loop:

Seleção dos professores utilizando ForEach dentro de ForEach
Não é um código muito grande, muito menos complexo, porém poderíamos obter o mesmo resultado da seguinte forma:

Seleção dos professores utilizando SelectMany
O SelectMany tem uma sintaxe muito simples, vamos explicar:
No exemplo acima, damos o nome de cada um dos colégios de colegio. Com 'FiltrarProfessoresQueConhecemMateria(colegio.Professores, materia)', dissemos que queremos selecionar cada um dos professores que conhecem a matéria passada por parâmetro, então todos os professores são unidos em uma única lista.

Se quiséssemos selecionar apenas o nome dos professores que conhecem tal matéria, como ficaria então?

Seleção do nome dos professores utilizando SelectMany
Para selecionar uma propriedade do item selecionado (no caso o professor), colocamos uma segunda expressão contendo:
professores representa a lista dos professores que está sendo criada item a item e professor é cada um dos professores. Basta dizer que queremos selecionar professor.Propriedade
Simples, não?

Criamos um exemplo que imprime o id de cada um dos professores encontrados em cada um dos métodos, utilizando o ForEach e utilizando o SelectMany, para mostrar que ambos tiveram o mesmo resultado.

Ids dos professores


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

Colegio.cs

Professor.cs

Materia.cs

ColegioFactory.cs

TestLinqSelectMany.cs

Program.cs

Nenhum comentário:

Postar um comentário