Back-End

3 dez, 2018

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

176 visualizações
Publicidade

Hoje irei 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>() está 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 retornar 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.

Dessa forma, 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 quê serve isso?

Vamos supor que você queira 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 atribuída. Caso contrário, você retorna as notas.

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

Exemplo:

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

Exemplo:

E 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.