Sdílet prostřednictvím


group – klauzule (Referenční dokumentace jazyka C#)

group Klauzule vrátí sekvence IGrouping objekty, které bude obsahovat nula či více položek, které odpovídají hodnoty klíče pro skupinu.Můžete například seskupit posloupnost řetězec podle prvního písmene každého řetězce.V tomto případě první písmeno je klíč a má typ chara je uložen v Key vlastnosti každého IGrouping objektu.Kompilátor odvodí typ klíče.

Můžete ukončit pomocí výrazu dotazu group klauzule, jak ukazuje následující příklad:

// Query variable is an IEnumerable<IGrouping<char, Student>> 
var studentQuery1 =
    from student in students
    group student by student.Last[0];

Pokud chcete provádět operace další dotaz na každou skupinu, dočasný identifikátor můžete určit pomocí do kontextové klíčové slovo.Při použití into, musí pokračovat v dotazu a nakonec končí buď select prohlášení nebo jinou group klauzule, jak je znázorněno v následujícím výňatku:

// Group students by the first letter of their last name 
// Query variable is an IEnumerable<IGrouping<char, Student>> 
var studentQuery2 =
    from student in students
    group student by student.Last[0] into g
    orderby g.Key
    select g;

Další příklady použití dokončení group s a bez into jsou uvedeny v části Příklad v tomto tématu.

Výčet výsledků dotazu skupiny

Protože IGrouping vyrobené objekty group dotazu jsou v podstatě seznam seznamů, je nutné použít vnořené foreach smyčce pro přístup k položkám v každé skupině.Vnější smyčka Iteruje přes skupinu klíčů a vnitřní smyčka Iteruje přes jednotlivé položky ve skupině, sám.Skupina může mít klíč, ale žádné prvky.Je foreach smyčky, která provede dotaz v předchozích příkladech kódu:

// Iterate group items with a nested foreach. This IGrouping encapsulates 
// a sequence of Student objects, and a Key of type char. 
// For convenience, var can also be used in the foreach statement. 
foreach (IGrouping<char, Student> studentGroup in studentQuery2)
{
     Console.WriteLine(studentGroup.Key);
     // Explicit type for student could also be used here. 
     foreach (var student in studentGroup)
     {
         Console.WriteLine("   {0}, {1}", student.Last, student.First);
     }
 }

Typy klíčů

Skupiny klíčů může být libovolný typ jako řetězec, vestavěné číselný typ nebo uživatelem definované s názvem typu nebo anonymní.

Seskupení podle řetězec

Předchozí příklady kódu, které jsou použity char.Řetězce klíče nelze snadno bylo zadáno místo, například dokončení příjmení:

// Same as previous example except we use the entire last name as a key. 
// Query variable is an IEnumerable<IGrouping<string, Student>> 
 var studentQuery3 =
     from student in students
     group student by student.Last;

Seskupení podle bool

Následující příklad ukazuje použití bool hodnoty klíče lze rozdělit do dvou skupin výsledků.Všimněte si, že hodnota vyrábí vykazovat v group klauzule.

class GroupSample1
{
    // The element type of the data source. 
    public class Student
    {
        public string First { get; set; }
        public string Last { get; set; }
        public int ID { get; set; }
        public List<int> Scores;
    }

    public static List<Student> GetStudents()
    {
        // Use a collection initializer to create the data source. Note that each element 
        //  in the list contains an inner sequence of scores.
        List<Student> students = new List<Student>
        {
           new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 72, 81, 60}},
           new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
           new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {99, 89, 91, 95}},
           new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {72, 81, 65, 84}},
           new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {97, 89, 85, 82}} 
        };

        return students;

    }

    static void Main()
    {
        // Obtain the data source.
        List<Student> students = GetStudents();

        // Group by true or false. 
        // Query variable is an IEnumerable<IGrouping<bool, Student>> 
        var booleanGroupQuery =
            from student in students
            group student by student.Scores.Average() >= 80; //pass or fail! 

        // Execute the query and access items in each group 
        foreach (var studentGroup in booleanGroupQuery)
        {
            Console.WriteLine(studentGroup.Key == true ? "High averages" : "Low averages");
            foreach (var student in studentGroup)
            {
                Console.WriteLine("   {0}, {1}:{2}", student.Last, student.First, student.Scores.Average());
            }
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
  Low averages
   Omelchenko, Svetlana:77.5
   O'Donnell, Claire:72.25
   Garcia, Cesar:75.5
  High averages
   Mortensen, Sven:93.5
   Garcia, Debra:88.25
*/

Seskupení podle číselný rozsah

Následující příklad používá výraz vytvořit číselné skupiny klíčů, které představují oblast percentil.Poznámka: použití nechat jako vhodné místo k uložení metoda volání výsledek, takže není nutné volat metodu dvakrát v group klauzule.Všimněte si také v group klauzule, aby výjimka "dělení nulou" kód zkontroluje Ujistěte se, že student nemá průměrně nula.Další informace o tom, jak bezpečně používat metody ve výrazech dotazu Postupy: Zpracování výjimek ve výrazech dotazů (Průvodce programováním v C#).

class GroupSample2
{
    // The element type of the data source. 
    public class Student
    {
        public string First { get; set; }
        public string Last { get; set; }
        public int ID { get; set; }
        public List<int> Scores;
    }

    public static List<Student> GetStudents()
    {
        // Use a collection initializer to create the data source. Note that each element 
        //  in the list contains an inner sequence of scores.
        List<Student> students = new List<Student>
        {
           new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 72, 81, 60}},
           new Student {First="Claire", Last="O'Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
           new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {99, 89, 91, 95}},
           new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {72, 81, 65, 84}},
           new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {97, 89, 85, 82}} 
        };

        return students;

    }

    // This method groups students into percentile ranges based on their 
    // grade average. The Average method returns a double, so to produce a whole 
    // number it is necessary to cast to int before dividing by 10.  
    static void Main()
    {
        // Obtain the data source.
        List<Student> students = GetStudents();

        // Write the query. 
        var studentQuery =
            from student in students
            let avg = (int)student.Scores.Average()
            group student by (avg == 0 ? 0 : avg / 10) into g
            orderby g.Key
            select g;            

        // Execute the query. 
        foreach (var studentGroup in studentQuery)
        {
            int temp = studentGroup.Key * 10;
            Console.WriteLine("Students with an average between {0} and {1}", temp, temp + 10);
            foreach (var student in studentGroup)
            {
                Console.WriteLine("   {0}, {1}:{2}", student.Last, student.First, student.Scores.Average());
            }
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
     Students with an average between 70 and 80
       Omelchenko, Svetlana:77.5
       O'Donnell, Claire:72.25
       Garcia, Cesar:75.5
     Students with an average between 80 and 90
       Garcia, Debra:88.25
     Students with an average between 90 and 100
       Mortensen, Sven:93.5
 */

Seskupení podle složeného klíče.

Složený klíč používejte, když chcete seskupení prvků více než jeden klíč.Pomocí anonymní typ nebo pojmenované držet klíčový prvek vytvoříte složený klíč.V následujícím příkladu předpokládejme, že třída Person byla deklarována s členy s názvem surname a city.group Klauzule způsobuje samostatnou skupinu pro každou sadu osob se stejným příjmením a stejné Město.

group person by new {name = person.surname, city = person.city};

Pojmenovaný typ použijte jinou metodu musí předat proměnnou dotazu.Vytvořit speciální třídy implementovány automatické vlastnosti pomocí klíčů a pak přepsat Equals a GetHashCode metod.Struktura, můžete použít také v případě nemáte přísně potlačit tyto metody.Další informace naleznete v tématech Postupy: Implementace lehké třídy s automaticky implementovanými vlastnostmi (Průvodce programováním v C#) a Postupy: Vytvoření dotazu na duplicitní soubory v adresářovém stromu (LINQ).Toto téma obsahuje příklad kódu, který demonstruje použití složený klíč s názvem typu.

Příklad

Následující příklad zobrazuje standardní vzorek pro řazení dat do skupin po logiku žádné další dotaz u skupiny.To se nazývá seskupení bez pokračování.Prvky pole řetězců jsou seskupeny podle jejich první písmeno.Výsledek dotazu je IGrouping typu, který obsahuje veřejné Key vlastnost typu char a IEnumerable kolekci, která obsahuje jednotlivé položky v seskupení.

Výsledek group klauzule je posloupnost sekvence.Proto přístup jednotlivých prvků v rámci každé skupiny vrácené používat vnořené foreach smyčka uvnitř smyčky, která iteruje skupiny klíčů, jak ukazuje následující příklad.

class GroupExample1
{
    static void Main()
    {
        // Create a data source. 
        string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" };

        // Create the query. 
        var wordGroups =
            from w in words
            group w by w[0];

        // Execute the query. 
        foreach (var wordGroup in wordGroups)
        {
            Console.WriteLine("Words that start with the letter '{0}':", wordGroup.Key);
            foreach (var word in wordGroup)
            {
                Console.WriteLine(word);
            }
        }

        // Keep the console window open in debug mode
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }        
}
/* Output:
      Words that start with the letter 'b':
        blueberry
        banana
      Words that start with the letter 'c':
        chimpanzee
        cheese
      Words that start with the letter 'a':
        abacus
        apple
     */

Tento příklad ukazuje, jak provést další logiku na skupiny po jejich vytvoření pomocí pokračování s into.Další informace naleznete v tématu into (Referenční dokumentace jazyka C#).Následující příklad dotazy každou skupinu vyberte pouze ty, jejichž hodnota klíče je samohláskový.

class GroupClauseExample2
{
    static void Main()
    {
        // Create the data source. 
        string[] words2 = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese", "elephant", "umbrella", "anteater" };

        // Create the query. 
        var wordGroups2 =
            from w in words2
            group w by w[0] into grps
            where (grps.Key == 'a' || grps.Key == 'e' || grps.Key == 'i'
                   || grps.Key == 'o' || grps.Key == 'u')
            select grps;

        // Execute the query. 
        foreach (var wordGroup in wordGroups2)
        {
            Console.WriteLine("Groups that start with a vowel: {0}", wordGroup.Key);
            foreach (var word in wordGroup)
            {
                Console.WriteLine("   {0}", word);
            }
        }

        // Keep the console window open in debug mode
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Groups that start with a vowel: a
        abacus
        apple
        anteater
    Groups that start with a vowel: e
        elephant
    Groups that start with a vowel: u
        umbrella
*/

Poznámky

V době kompilace group doložky jsou přeloženy do volání GroupBy``2 metoda.

Viz také

Úkoly

Postupy: Vytvoření vnořené skupiny (Průvodce programováním v C#)

Postupy: Seskupení výsledků dotazu (Průvodce programováním v C#)

Postupy: Provádění poddotazů na skupinách (Průvodce programováním v C#)

Referenční dokumentace

IGrouping

GroupBy``2

ThenBy``2

ThenByDescending``2

Koncepty

LINQ – výrazy dotazů (Průvodce programováním v C#)

Další zdroje

Klíčová slova dotazu (Referenční dokumentace jazyka C#)