[LINQ]El método ToLookUp

Definición

Según la definición de MSDN, el método ToLookUp ejecutado sobre una variable que implemente el Tipo IEnumarable<T>, va a devolver un Diccionario (Dictionary) a través de las condiciones de agrupación indicadas, y mostrando el dato indicado.

Ejemplos de Uso

Para ver la utilidad de este método, vamos a ver una serie de ejemplos basados en una lista de Ejemplo acerca de la siguiente clase:

   1: class Persona

   2: {

   3:     public string Nombre { get; set; }

   4:     public int Edad { get; set; }

   5:     public string Departamento { get; set; }        

   6: }

Y una lista con los siguientes datos:

   1: personas.Add(new Persona { Nombre = "Alvaro", Edad = 1, Departamento = "Habitacion 1" });

   2: personas.Add(new Persona { Nombre = "Izan", Edad = 1, Departamento = "Habitacion 1" });

   3: personas.Add(new Persona { Nombre = "Martina", Edad = 29, Departamento = "Habitacion 2" });

   4: personas.Add(new Persona { Nombre = "Javi", Edad = 28, Departamento = "Habitacion 2" });

Ejemplo 1: Agrupar las personas según el Departamento al que pertenecen:

   1: var agrupados = personas.ToLookup(a => a.Departamento );

   2: foreach (var grupo in agrupados)

   3: {

   4:     Console.WriteLine(grupo.Key);

   5:     foreach (var persona in grupo)

   6:     {

   7:         Console.WriteLine(String.Format("{0} tiene {1} años",persona.Nombre,persona.Edad));

   8:     }

   9: }

El resultado obtenido sería:

   1: Habitacion 1 

   2: Alvaro tiene 1 años

   3: Izan tiene 1 años

   4: Habitacion 2

   5: Martina tiene 29 años

   6: Javi tiene 28 años

Ejemplo 2: Agrupar las personas según departamento y solo visualizar su nombre.

   1: var agrupados = personas.ToLookup(a => a.Departamento,a=>a.Nombre );

   2: foreach (var grupo in agrupados)

   3: {

   4:     

   5:     Console.WriteLine(grupo.Key);

   6:     foreach (var persona in grupo)

   7:     {

   8:         Console.WriteLine(String.Format("Nombre: {0}",persona));

   9:     }

  10: }

 

Cuyo resultado sería:

   1: Habitacion 1

   2: Nombre: Alvaro

   3: Nombre: Izan

   4: Habitacion 2

   5: Nombre: Martina

   6: Nombre: Javi

 

Ejemplo 3: Agrupar las personas por departamento y edad:

   1: var agrupados = personas.ToLookup(a => new {a.Departamento,a.Edad});

   2: foreach (var grupo in agrupados)

   3: {

   4:     Console.WriteLine(String.Format("Departamento {0} Edad {1}",grupo.Key.Departamento,grupo.Key.Edad));

   5:     foreach (var persona in grupo)

   6:     {

   7:         Console.WriteLine(String.Format("Nombre: {0}",persona.Nombre));

   8:     }

   9: }

 

Y el resultado sería:

   1: Departamento Habitacion 1 Edad 1

   2: Nombre: Alvaro

   3: Nombre: Izan

   4: Departamento Habitacion 2 Edad 29

   5: Nombre: Martina

   6: Departamento Habitacion 2 Edad 28

   7: Nombre: Javi

Bueno, espero que os sea de utilidad.

Saludos.

2 comentarios sobre “[LINQ]El método ToLookUp”

  1. Buen artículo Javier!
    Si leyendo el artículo de Javier alguien se pregunta: Y cual es la diferencia de ToLookup() y Join()???
    Pues a grandes rasgos, la misma que hay entre ToList() y AsEnumerable().
    ToLookup() materializa la colección, mientras que Join() tiene ejecución diferida.

    class Program
    {
    static void Main(string[] args)
    {
    List list = new List();

    list.Add(new Persona() { Nombre = «Pepito», Edad = 30});
    list.Add(new Persona() { Nombre = «Pepote», Edad = 30 });
    list.Add(new Persona() { Nombre = «Pepazo», Edad = 40 });

    var lookup = list.ToLookup(x => x.Edad);
    var groupby = list.GroupBy(x => x.Edad);
    }
    }

    class Persona
    {
    private int _edad;
    public string Nombre { get; set; }
    public int Edad
    {
    get { Console.WriteLine(«*** Persona::get_Edad()»); return _edad; }
    set { _edad = value; }
    }
    }

    Si ejecutais este código veréis que se imprime 3 veces la línea «*** Persona::get_Edad()».
    Si comentais la linea var lookup=… vereis que no se muestra ninguna línea. Eso es porque groupby NO ejecuta la sentencia hasta que el resultado del agrupamiento es accedido. Al revés que ToLookup que materializa la colección en el acto.

    Saludos!

  2. *Argh!*
    Por supuesto en el comentario anterior donde digo Join() quiero decir GroupBy().

    Y es que… no se pueden hacer dos cosas a la vez… ^_^

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *