Operadores de LINQ: Filtering

Tabla de contenidos:

OfType

El operador OfType nos permite filtrar una secuencia dado un tipo.

Código necesario para los ejemplos:

Lista de objetos al azar:

object[] objetos = {"LINQ", 1, 23.4F, "Perro", new object(), "Casa"};

Volver al operador OfType

OfType:

public static IEnumerable<TResult> OfType<TResult>(
    this IEnumerable source
)

Le especificamos el tipo que queremos filtrar y nos devuelve una enumeración de dicho tipo.

Por ejemplo, si queremos solo los elementos del tipo string usamos el operador OfType para filtrar esa secuencia:

IEnumerable<string> cadenas = objetos.OfType<string>();

Si imprimimos el resultado, la salida sería:

LINQ
Perro
Casa

Volver a la tabla de contenidos

Where

El operador Where nos permite filtrar una secuencia, pero a diferencia de OfType, el operador Where es mucho más flexible puesto que admite como parámetro un delegado.

Código necesario para los ejemplos:

Lista de títulos (imaginarios) de libros:

var libros = new List<string>
		  {
			  "Programando en c#",
			  "LINQ para torpes",
			  "WPF para todos",
			  "Empezando con LINQ",
			  "LINQ Avanzado"
		  };

Volver al operador Where

Where estándar:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

En este caso Where acepta un delegado el cual recibe como parámetro un elemento de la secuencia y nos devuelve un bool que nos indica si ese elemento se filtra o no. El operador devuelve una enumeración con los elementos filtrados.

Queremos una nueva lista de libros donde sólo esten los que sean de LINQ, para ello usamos Where:

IEnumerable<string> librosLINQ = libros.Where(libro => libro.Contains("LINQ"));

Además, el operador Where se puede convertir a la sintaxis de un query expression:

IEnumerable<string> librosLINQ = from libro in libros
				 where libro.Contains("LINQ")
				 select libro;

En ambos casos, el resultado de imprimirlo sería:

LINQ para torpes
Empezando con LINQ
LINQ Avanzado

Volver al operador Where

Where + índice:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int, bool> predicate
)

En este caso, el delegado acepta también un int el cual representa la posición de ese elemento en la secuencia que estamos filtrando.

Así que si por ejemplo queremos aquellos libros de LINQ que estén dentro de las 3 primeras posiciones de la secuencia, podemos usar el siguiente fragmento:

IEnumerable<string> librosLINQ = libros.Where((libro, index) => libro.Contains("LINQ") &amp;&amp; index < 3);

Esto imprimiría:

LINQ para Torpes

La versión de Where que acepta también el índice, no puede ser convertida a la sintaxis de los query expressions

Volver a la tabla de contenidos

Tags:

Un comentario

Dejar un comentario