Agrupar Datos Linq (GroupBy) C# - VB.Net

martes, 28 de agosto de 2012

Siguiendo con ejemplos de linq ahora veremos como funciona el operador GroupBy.

El operador GroupBy nos permite agrupar una secuencia de datos bajo una clave.

Mas información.
group (Cláusula, Referencia de C#)
Group By (Cláusula, Visual Basic)

En este articulo trataremos los siguientes puntos.
  • Mostrar datos de una lista en ListView.
  • Agrupar datos de una lista tipo clase.
  • Mostrar datos agrupados en ListView.

Veamos el diseño que tendrá nuestra aplicacion.

Diseño


Como pueden observar el form solo cuenta con un listview al cual se le definieron 3 columnas en tiempo de diseño y también se tiene un botón.

Ahora agregamos una clase llamada Persona.
public class Persona
{
   public string Nombre { get; set; }
   public int Edad { get; set; }
   public string Pais { get; set; }
   public Persona(string nom, int ed, string pa)
   {
          Nombre = nom;
          Edad = ed;
          Pais = pa;
   }
} 

Public Class Persona
  Public Property Nombre() As String
  Public Property Edad() As Integer
  Public Property Pais() As String

  Public Sub New(ByVal nom As String, ByVal ed As Integer, ByVal pa As String)
      Nombre = nom
      Edad = ed
      Pais = pa
  End Sub

End Class

Es una simple clase que nos servirá para el manejo de nuestros datos.

Ahora creemos una lista de tipo Persona y agreguemos unos registros.
List<persona> personas = new List<persona>
{
   new Persona("Cristian", 21, "El Salvador"),
   new Persona("Fatima", 19, "Argentina"),
   new Persona("Juan", 25, "El Salvador"),
   new Persona("Maria", 18, "España"),
   new Persona("Javier", 40, "Argentina"),
   new Persona("Rosa", 35, "Mexico"),
   new Persona("Josue", 26, "España"),
   new Persona("Karla", 50, "Mexico")
};

Dim personas As New List(Of Persona)() From {
   New Persona("Cristian", 21, "El Salvador"), _
   New Persona("Fatima", 19, "Argentina"), _
   New Persona("Juan", 25, "El Salvador"), _
   New Persona("Maria", 18, "España"), _
   New Persona("Javier", 40, "Argentina"), _
   New Persona("Rosa", 35, "Mexico"), _
   New Persona("Josue", 26, "España"), _
   New Persona("Karla", 50, "Mexico") _
}

En los registros que hemos agregado pueden notar que algunas personas son del mismo país entonces utilizaremos ese dato para agruparlos por país.

Cargar datos en el ListView(cargamos los datos sin agrupar)

Primero cargaremos los datos así como están sin agrupar en listview.
foreach (var p in personas)
{
   ListViewItem item = new ListViewItem(p.Pais);
   item.SubItems.Add(p.Nombre);
   item.SubItems.Add(p.Edad.ToString());
   listView1.Items.Add(item);
}

For Each p In personas
  Dim item As New ListViewItem(p.Pais)
  item.SubItems.Add(p.Nombre)
  item.SubItems.Add(p.Edad.ToString())
  listView1.Items.Add(item)
Next

Recorremos la lista con un ciclo foreach y dentro vamos agregando los datos al listview.

Agrupar los datos y mostrarlos en el ListView.
Agruparemos los datos por país y de una sola vez los mostraremos agrupados dentro del listview.
var agrupar = personas.GroupBy(persona => persona.Pais);
string group = "";
ListViewGroup g = new ListViewGroup();
listView1.Items.Clear();
foreach (var p in agrupar)
{
    if (p.Key.ToString() != group)
    {
         g = new ListViewGroup(p.Key.ToString());
         group = p.Key.ToString();
         listView1.Groups.Add(g);
    }
    foreach (var persona in p)
    {
         ListViewItem item = new ListViewItem("");
         item.SubItems.Add(persona.Nombre);
         item.SubItems.Add(persona.Edad.ToString());
         item.Group = g;
         listView1.Items.Add(item);
    }
}

Dim agrupar = personas.GroupBy(Function(persona) persona.Pais)
Dim group As String = ""
Dim g As New ListViewGroup()
listView1.Items.Clear()
For Each p In agrupar
  If p.Key.ToString() <> group Then
       g = New ListViewGroup(p.Key.ToString())
       group = p.Key.ToString()
       listView1.Groups.Add(g)
  End If
  For Each persona In p
      Dim item As New ListViewItem("")
      item.SubItems.Add(persona.Nombre)
      item.SubItems.Add(persona.Edad.ToString())
      item.Group = g
      listView1.Items.Add(item)
  Next
Next

Lo primero que hacemos es agrupar los datos haciendo uso de linq agrupamos los datos por país, luego declaramos una variable string vacía y también se crea un objeto ListViewGroup esto nos servirá para poder mostrar los datos agrupados en el listview, luego recorremos el resultado de nuestra consulta linq y vamos agregando los datos ya agrupados en el listview.

Datos sin agrupar


Datos agrupados


Eso es todo espero les sirva mucho saludos desde El Salvador...

Descargar Proyecto C#

Descargar Proyecto VB.Net


No olvides suscribirte al blog para estar pendientes de mis últimos artículos.

4 comentarios:

Globitoshop dijo...

Hey Cristian Barbaro sos la hostia hermano y un orgullo para este pais!

Segui echandole ganas y echandole ganas a qiuenes lo necesitamos!! (y)

Cristian Torres dijo...

Hola.
Gracias y por supuesto que seguiré aportando artículos y ejemplo que puedan ser de ayuda a los demás.

Saludos.

Anónimo dijo...

Lo probare!!!...gracias por compartir Cristian :)

Jorge A dijo...

Esto se puede hacer en un datagridview?

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.