LINQ | Operador de agrupación | Agrupar por

En LINQ, los operadores de agrupación seleccionan los elementos de la secuencia o colección que contiene atributos comunes y los sirven en un grupo. O en otras palabras, podemos decir que el operador de agrupación devuelve el grupo de elementos en función de la clave dada. Este grupo se mantiene en un tipo especial de colección, que implementa la interfaz IGrouping<TKey, TElement>, donde TKey es la clave a través de la cual se crea el grupo y TElement es la colección de elementos que empareja con el valor de la clave de agrupación. Por ejemplo, una secuencia contiene 6 elementos, es decir, Abc, cvd, Abc, Abc, ert, Por, . Ahora queremos un grupo que contenga todos los Abc presentes en esa secuencia. Entonces Abc es la clave a través de la cual creamos otro grupo que contiene 3 Abc. Como se muestra en la siguiente imagen:

El operador de consulta estándar contiene 2 tipos diferentes de operadores de agrupación:

  1. Agrupar por
  2. Para buscar

Agrupar por operador

El funcionamiento del operador GroupBy es similar a la cláusula SQL GroupBy. Se utiliza para devolver el grupo de elementos que comparten los atributos comunes o la clave de la secuencia o colección dada. Cada grupo está representado por el objeto IGrouping<TKey, TElement>.

Puntos importantes:

  • Admite la sintaxis de consulta en los lenguajes C# y VB.Net. Como se muestra en el ejemplo 1.
  • También puede usar into con GroupBy en la consulta de C#. La palabra clave into le permite continuar con la consulta y puede realizar más operaciones de consulta. O en otras palabras, es un identificador temporal que le permite realizar una operación de consulta adicional.
  • También puede usar Into Group con GroupBy en VB.Net.
  • La consulta LINQ finaliza con la cláusula de ayuda Select o Groupby.
  • También puede admitir la sintaxis de métodos en los lenguajes C# y VB.Net. Como se muestra en el ejemplo 2.
  • Está presente tanto en la clase Queryable como en la Enumerable. Y en estas clases, el método GroupBy está sobrecargado en ocho tipos diferentes.
  • Se implementa mediante el uso de ejecución diferida.
  • El valor de la clave puede ser de cualquier tipo, ya sea string, int, flotante, anónimo, booleano, etc., según los requisitos del usuario.
  • El grupo devuelto por este operador puede contener cero o más elementos que coincidan con el valor clave.

Ejemplo 1:

// C# program to divide the employees
// in groups according to their salary
using System;
using System.Linq;
using System.Collections.Generic;
  
// Employee details
public class Employee {
  
    public int emp_id
    {
        get;
        set;
    }
  
    public string emp_name
    {
        get;
        set;
    }
  
    public string emp_gender
    {
        get;
        set;
    }
  
    public string emp_hire_date
    {
        get;
        set;
    }
  
    public int emp_salary
    {
        get;
        set;
    }
}
  
class GFG {
  
    // Main method
    static public void Main()
    {
        List<Employee> emp = new List<Employee>() {
  
            new Employee() {emp_id = 209, emp_name = "Anjita", emp_gender = "Female",
                                    emp_hire_date = "12/3/2017", emp_salary = 20000},
  
            new Employee() {emp_id = 210, emp_name = "Soniya", emp_gender = "Female",
                                    emp_hire_date = "22/4/2018", emp_salary = 30000},
  
            new Employee() {emp_id = 211, emp_name = "Rohit", emp_gender = "Male",
                                  emp_hire_date = "3/5/2016", emp_salary = 40000},
  
            new Employee() {emp_id = 212, emp_name = "Supriya", emp_gender = "Female",
                                      emp_hire_date = "4/8/2017", emp_salary = 40000},
  
            new Employee() {emp_id = 213, emp_name = "Anil", emp_gender = "Male",
                                emp_hire_date = "12/1/2016", emp_salary = 40000},
  
            new Employee() {emp_id = 214, emp_name = "Anju", emp_gender = "Female",
                                  emp_hire_date = "17/6/2015", emp_salary = 50000},
        };
  
        // Query to divide the employees
        // in the groups according to 
        // their salary using GroupBy 
        // operator in query syntax
        var res = from e in emp
                    group e by e.emp_salary;
  
        foreach(var val in res)
        {
              
            // Here salary is the key value
            Console.WriteLine("Group By Salary: {0}", val.Key);
  
            // Display name of the employees
            // Inner collection according to
            // the key value
            foreach(Employee e in val)
            {
                Console.WriteLine("Employee Name: {0}",
                                           e.emp_name);
            }
        }
    }
}
Producción:

Group By Salary: 20000
Employee Name: Anjita
Group By Salary: 30000
Employee Name: Soniya
Group By Salary: 40000
Employee Name: Rohit
Employee Name: Supriya
Employee Name: Anil
Group By Salary: 50000
Employee Name: Anju

Ejemplo 2:

// C# program to divide the employees
// in the groups according to their
// language
using System;
using System.Linq;
using System.Collections.Generic;
  
// Employee details
public class Employee {
  
    public int emp_id
    {
        get;
        set;
    }
  
    public string emp_name
    {
        get;
        set;
    }
  
    public string emp_gender
    {
        get;
        set;
    }
  
    public string emp_hire_date
    {
        get;
        set;
    }
  
    public int emp_salary
    {
        get;
        set;
    }
    public string emp_lang
    {
        get;
        set;
    }
}
  
class GFG {
  
    // Main method
    static public void Main()
    {
        List<Employee> emp = new List<Employee>() {
  
            new Employee() {emp_id = 209, emp_name = "Anjita", emp_gender = "Female",
                 emp_hire_date = "12/3/2017", emp_salary = 20000, emp_lang = "Ruby"},
  
            new Employee() {emp_id = 210, emp_name = "Soniya", emp_gender = "Female",
                 emp_hire_date = "22/4/2018", emp_salary = 30000, emp_lang = "Java"},
  
            new Employee() {emp_id = 211, emp_name = "Rohit", emp_gender = "Male",
               emp_hire_date = "3/5/2016", emp_salary = 40000, emp_lang = "Perl"},
  
            new Employee() {emp_id = 212, emp_name = "Supriya", emp_gender = "Female",
                     emp_hire_date = "4/8/2017", emp_salary = 40000, emp_lang = "Java"},
  
            new Employee() {emp_id = 213, emp_name = "Anil", emp_gender = "Male",
               emp_hire_date = "12/1/2016", emp_salary = 40000, emp_lang = "C#"},
  
            new Employee() {emp_id = 214, emp_name = "Anju", emp_gender = "Female",
                 emp_hire_date = "17/6/2015", emp_salary = 50000, emp_lang = "C#"},
        };
  
        // Query to divide the employees in 
        // the groups according to their 
        // language using GroupBy method in
        // the method syntax
        var res = emp.GroupBy(e => e.emp_lang);
  
        foreach(var val in res)
        {
              
            // Here language is the key value
            Console.WriteLine("Group By Language: {0}", val.Key);
  
            // Display name of the employees
            // Inner collection according to
            // the key value
            foreach(Employee e in val)
            {
                Console.WriteLine("Employee Name: {0}", e.emp_name);
            }
        }
    }
}
Producción:

Group By Language: Ruby
Employee Name: Anjita
Group By Language: Java
Employee Name: Soniya
Employee Name: Supriya
Group By Language: Perl
Employee Name: Rohit
Group By Language: C#
Employee Name: Anil
Employee Name: Anju

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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