Operadores de LINQ: Generation

Tabla de contenidos:

DefaultIfEmpty

El operador DefaultIfEmpty devuelve una secuencia o un valor predefinido si dicha secuencia está vacía.

Código necesario para los ejemplos:

Una lista de lenguajes:

List<string> lenguajes = new List<string> {"C#", "Visual Basic", "Python", "PHP", "C"};

Una lista vacía:

List<int> listaVacia = new List<int>();

Volver al operador DefaultIfEmpty

DefaultIfEmpty estándar:

public static IEnumerable<TSource> DefaultIfEmpty<TSource>(
	this IEnumerable<TSource> source
)

El operador se usa sobre una secuencia. Si la secuencia contiene elementos pues devolverá dichos elementos sin tocar. Si no hay elementos, devolverá el valor predefinido.

Por ejemplo, si lo usamos en la lista de lenguajes:

IEnumerable<string> llena = lenguajes.DefaultIfEmpty();

Al no estar vacía, simplemente devolverá todos y cada uno de los elementos:

C#
Visual Basic
Python
PHP
C

¿Pero qué pasa si la usamos en una vacía?:

IEnumerable<int> vacia = listaVacia.DefaultIfEmpty();

Que al no haber elementos, devolverá el valor predefinido, o sea:

0

Volver al operador DefaultIfEmpty

DefaultIfEmpty + valor predefinido:

public static IEnumerable<TSource> DefaultIfEmpty<TSource>(
	this IEnumerable<TSource> source,
	TSource defaultValue
)

¿Podríamos cambiar el valor predefinido por uno más útil para nuestra aplicación? Con esta sobrecarga podemos definir cual será dicho valor.

Por ejemplo, en nuestra aplicación usamos el número -1 para indicar que una lista está vacía (Siempre es mejor usar una enumeración en estos casos):

IEnumerable<int> vacia = listaVacia.DefaultIfEmpty(-1);

Simplemente tenemos que pasarle dicho valor predefinido al operador y lo usará si la secuencia está vacía.

Obviamente el contenido de vacia es:

-1

Volver a la tabla de contenidos

Empty

El operador Empty crea una enumeración de un tipo dado.

Empty:

public static IEnumerable<TResult> Empty<TResult>()

͉ste operador no se usa en ninguna secuencia, se usa para crear una enumeración de un tipo dado por el operador.

Por ejemplo, si queremos una enumeración de cadenas podemos hacer:

IEnumerable<string> cadenas = Enumerable.Empty<string>();

Con eso tenemos una enumeración de string lista para ser usada con algún otro operador.

Volver a la tabla de contenidos

Range

El operador Range genera una secuencia de números enteros.

Range:

public static IEnumerable<int> Range(
	int start,
	int count
)

Al operador le pasamos dos números. El de inicio y el que indica la cantidad de números a generar.

Por ejemplo si queremos generar 5 números haríamos:

IEnumerable<int> numeros = Enumerable.Range(1, 5);

Le estamos diciendo que empiece por 1 y que genere cinco números, entonces la salida sería:

1
2
3
4
5

Hay que fijarse que genera los numeros en orden, si quisieramos por ejemplo los siguientes 5 numeros pares empezando por el 2 necesitaríamos la ayuda de otro operador, por ejemplo:

IEnumerable<int> numeros = Enumerable.Range(2, 5).Select(x => x * 2);

Cada número lo multiplicamos por 2 y ya está :P

4
6
8
10
12

Volver a la tabla de contenidos

Repeat

El operador Repeat genera una secuencia de un elemento repetido x veces.

Repeat:

public static IEnumerable<TResult> Repeat<TResult>(
	TResult element,
	int count
)

Al operador le indicamos el elemento a repetir y la cantidad de veces.

Por ejemplo, vamos a crear una enumeración que contenta la cadena El Blog de Fox 5 veces:

IEnumerable<string> blogFox = Enumerable.Repeat("El Blog de Fox", 5);

O sea:

El Blog de Fox
El Blog de Fox
El Blog de Fox
El Blog de Fox
El Blog de Fox

Volver a la tabla de contenidos

Tags:

Un comentario

Dejar un comentario