Escrito el 01/05/2024

Tutorial LINQ: Cambio de tipo de colección

Existe toda una familia de métodos que pueden usarse para cambiar el tipo de colección.

ToArray

Cambia de un IEnumerable<T> al tipo T[]

ToList

Cambia de un IEnumerable<T> al tipo List<T>

ToHashSet

Cambia de un IEnumerable<T> al tipo HashSet<T> dónde todos los elementos son únicos. Elimina duplicados.

ToDictionary

Cambia de un IEnumerable<T> al tipo Dictionary<Tkey, T>. Se debe especificar un selector para identificar la key.

var usersDictionary = users.ToDictionary(
    x => x.ID, // la clave será el ID del usuario
    x => x // el valor es el usuario mismo
); // diccionario de id, usuario

Nota 1: Se puede evitar usar el selector para el valor. Esto utilizará el elemento como valor. Nota 2: Si el selector de clave devuelve dos valores iguales, disparará una exceptión en tiempo de ejecución.

ToLookup

Permite obtener un diccionario pero con multiples valores para una clave. Cambia de un IEnumerable<T> al tipo ILookup<Tkey, T>. Se debe especificar un selector para identificar la key y otro para los valores.

var usersDictionary = users.ToLookup(
    x => x.Age, // la clave será el ID del usuario
    x => x // el valor es el usuario mismo
); // diccionario de edad, usuarios

Nota 3: Se puede evitar usar el selector para el valor. Esto utilizará el elemento como valor.

AsEnumerable

Cambia de un IEnumerable<T> al tipo IEnumerable<T>. Por ejemplo, cuando se tiene una implementación de una lista muy particular que no permita filtrados, pero permite convertirse a un enumerable que sí lo hace

var specificList = new ListWithoutWhereCondition<User>();
var userFiltered = specificList.Where(x => x.Age > 20); // dispara una excepción
var userFiltered = specificList.AsEnumerable().Where(x => x.Age > 20); // retorna una colleción

Cast

Cambia de un IEnumerable<T> al tipo IEnumerable<R>. Permite cast cada elemento de la colección y devolver una nueva,

var decimals = new decimal[]{1.3,2.1,3.9};
var integers = decimals.Cast<int>(); // colección de ints (los números redondeados)