C# - Apresentando Empty<T>() e DefaultIfEmpty<T>()


Hoje vou apresentar o método estático Empty<T>() e o método DefaultIfEmpty<T>() do namespace System.Linq. 

Método Empty<T>()

O método Empty<T>() esta presente no namespace System.Linq e retorna um IEnumerable<T> vazio que tem o argumento do tipo especificado.

Este método armazena em cache uma sequência vazia do tipo TResult, e, quando o objeto retornado for enumerado, ele não gera elemento algum.

Em alguns casos, esse método é útil para passar uma sequência vazia para um método definido pelo usuário que usa um IEnumerable<T>.

Ele também pode ser usado para gerar um elemento neutro para métodos como Union<TSource>.

Dessa forma o método Empty<T>() gera um IEnumerable de zero elementos podendo ser usado quando você quer evitar uma expressão de consulta, e, em vez disso, apenas deseja usar uma sequência vazia.

Ele é um método estático e você precisa especificar o tipo da sequência que você deseja gerar.

Exemplo:

No código EnumerableEmpty<int> vai retornra uma sequência com zero elementos de inteiros. Verificamos isso usando o método de extensão Count(). Para obter um array vazio usamos ToArray.

A implementação do Empty usa um tipo genérico estático e, em seguida, chama uma propriedade (Instance) nesse tipo. Uma matriz vazia é inicializada lentamente na propriedade Instance.

Assim você pode usar este método quando desejar chamar um método que recebe uma coleção IEnumerable, usando Enumerable.Empty quando precisar.

Método DefaultIfEmpty<T>()

O método DefaultIfEmpty<T>() retorna os elementos da sequência especificada ou o valor padrão do parâmetro de tipo em uma coleção de singletons se a sequência estiver vazia.

Este método atua substituindo uma coleção vazia com uma coleção com um valor padrão que depende do tipo da coleção.

Mas pra que serve isso ???

Vamos supor que você deseja retornar uma sequência contendo um único item padrão se a sequência for vazia ?

Imagine o seguinte cenário...

Você tem uma lista de notas de um aluno e deseja retornar um único valor igual a zero se o aluno não possuir nenhuma nota atribuida. Caso contrário você retorna as notas.

Usar o método DefaultIfEmpty() resolver esse problema de forma bem simples.

Exemplo:

Aqui como a sequência não é vazia é retornado os valores da mesma.

Exemplo:

Aqui como a sequência não é vazia é retornado o valor padrão do parâmetro do tipo, no exemplo, o valor zero, pois o tipo é int.

Dessa forma o método DefaultIfEmpty lida com coleções vazias de uma maneira especial e retorna um valor padrão, não um erro.

Com ele, substituímos coleções vazias por uma coleção singleton que pode ser mais compatível com outras partes do seu programa C#.

Podemos também passar um argumento para o método DefaultIfEmpty, e, ele se torna o valor usado no valor da coleção singleton.

Exemplo:

Note que o valor padrão foi definido pelo argumento. Dessa forma você pode usar um objeto padrão personalizado que tenha um comportamento especial.

Mas, tenha cuidado, se você chamar DefaultIfEmpty em uma referência nula, você receberá um NullReferenceException.

Nota: Este método é usado para obter consultas de junção left, right e full outer join.

Pegue o código do projeto aqui: CShp_Construtor2.zip

"Ora, àquele que é poderoso para vos guardar de tropeçar, e apresentar-vos irrepreensíveis, com alegria, perante a sua glória,
Ao único Deus sábio, Salvador nosso, seja glória e majestade, domínio e poder, agora, e para todo o sempre. Amém."

Judas 1:24,25

Veja os Destaques e novidades do SUPER DVD Visual Basic : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti