C# - Usando OrderBy do Linq com valores null
Hoje voltamos ao LINQ para mostrar como usar o operador OrderBy com valores null.

O operador OrderBy no LINQ é usado para classificar os valores de uma lista ou coleção em ordem crescente. Por padrão, ele vai classificar uma lista de valores em ordem crescente, não precisamos adicionar nenhuma condição crescente na instrução de consulta.

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:


José Carlos Macoratti