![]() |
Hoje voltamos ao LINQ para mostrar como usar o operador OrderBy com valores null. |
Simples assim:
using System.Linq;
namespace CShp_LinqOrderBy
{
class Aluno
{
public string Nome { get; set; }
public int Idade { get; set; }
public DateTime? Matricula { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Aluno> alunos = new List<Aluno>()
{
new Aluno() { Nome="Carolina" , Idade=25, Matricula=new DateTime(2109,2,5) },
new Aluno() { Nome="Paulo" , Idade=18, Matricula=new DateTime(2019,2,11)},
new Aluno() { Nome="Cristina" , Idade=21, Matricula=null},
new Aluno() { Nome="Amanda" , Idade=23, Matricula=new DateTime(2019,3,2) },
new Aluno() { Nome="José" , Idade=22, Matricula=new DateTime(2019,2,10) },
new Aluno() { Nome="Samuel" , Idade=29, Matricula=null },
new Aluno() { Nome="Vitória" , Idade=32, Matricula=new DateTime(2019,2,4) },
new Aluno() { Nome="Beatriz" , Idade=24, Matricula=null }
};
var listaAlunos = alunos.OrderBy(x => x.Nome);
foreach (var aluno in listaAlunos)
{
Console.WriteLine(aluno.Nome);
}
Console.ReadLine();
}
}
}
|
O resultado obtido será:
Agora vamos supor que você deseja exibir uma lista das matriculas de um aluno por ordem crescente. Como vemos temos alguns alunos que ainda não possuem uma data de matrícula válida definida, ou seja o valor é null.
Por instinto você já pensa em usar o operador LINQ OrderBy, portanto, podemos fazer o seguinte:
...
var ordemMatricula = alunos.OrderBy(m => m.Matricula);
foreach (var matricula in ordemMatricula)
{
Console.WriteLine($"{matricula.Matricula} - {matricula.Nome}");
}
Console.ReadLine();
|
Veja o resultado obtido:
Observe que os valores null vem para o início da lista.
E se você quiser exibir os alunos com matricula ainda não definida no final da lista ?
A solução para isso é simples.
Primeiro, classificamos pela propriedade Matricula.HasValue em ordem decrescente e, em seguida, por Matricula.
Veja como fica:
... var ordemMatricula = alunos .OrderByDescending(m => m.Matricula.HasValue) .ThenBy(m => m.Matricula); foreach (var matricula in ordemMatricula)
{
Console.WriteLine($"{matricula.Matricula} - {matricula.Nome}");
}
Console.ReadLine();
|
Agora o resultado obtido será:
Simples assim...
Pegue o código do
projeto aqui:
CShp_LinqOrderBy.zip
"Ninguém jamais
viu a Deus; se nos amamos uns aos outros, Deus está em nós, e em nós é perfeito
o seu amor.
Nisto conhecemos que estamos nele, e ele em nós, pois que nos deu do seu
Espírito.
E vimos, e testificamos que o Pai enviou seu Filho para Salvador do mundo."
1 João 4:12-14
Referências: