Aracılığıyla paylaş


Nasıl yapılır: Grup sorgu sonuçları (C# Programlama Kılavuzu)

Gruplandırma en üstün özelliklerinden biri olan LINQ.Aşağıdaki örnekler, çeşitli şekillerde verileri gruplandırmak üzere nasıl açıklar:

  • Tek bir özelliğe göre.

  • Bir dize özelliğini ilk harfe göre.

  • Bir hesaplanmış sayısal aralığına göre.

  • Boolean yüklemi veya diğer ifade.

  • Bir bileşik anahtar.

Buna ek olarak, son iki sorgu sonuçları Öğrenci ilk yalnızca içeren ve Soyadı yeni bir anonim tür proje.Daha fazla bilgi için, bkz. GROUP BY (C# Reference).

Örnek

Bu konudaki tüm örnekler aşağıdaki yardımcı sınıflar ve veri kaynaklarını kullanın.

public class StudentClass
{
    #region data
    protected enum GradeLevel { FirstYear = 1, SecondYear, ThirdYear, FourthYear };
    protected class Student
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int ID { get; set; }
        public GradeLevel Year;
        public List<int> ExamScores;
    }

    protected static List<Student> students = new List<Student>
    {
        new Student {FirstName = "Terry", LastName = "Adams", ID = 120, 
            Year = GradeLevel.SecondYear, 
            ExamScores = new List<int>{ 99, 82, 81, 79}},
        new Student {FirstName = "Fadi", LastName = "Fakhouri", ID = 116, 
            Year = GradeLevel.ThirdYear,
            ExamScores = new List<int>{ 99, 86, 90, 94}},
        new Student {FirstName = "Hanying", LastName = "Feng", ID = 117, 
            Year = GradeLevel.FirstYear, 
            ExamScores = new List<int>{ 93, 92, 80, 87}},
        new Student {FirstName = "Cesar", LastName = "Garcia", ID = 114, 
            Year = GradeLevel.FourthYear,
            ExamScores = new List<int>{ 97, 89, 85, 82}},
        new Student {FirstName = "Debra", LastName = "Garcia", ID = 115, 
            Year = GradeLevel.ThirdYear, 
            ExamScores = new List<int>{ 35, 72, 91, 70}},
        new Student {FirstName = "Hugo", LastName = "Garcia", ID = 118, 
            Year = GradeLevel.SecondYear, 
            ExamScores = new List<int>{ 92, 90, 83, 78}},
        new Student {FirstName = "Sven", LastName = "Mortensen", ID = 113, 
            Year = GradeLevel.FirstYear, 
            ExamScores = new List<int>{ 88, 94, 65, 91}},
        new Student {FirstName = "Claire", LastName = "O'Donnell", ID = 112, 
            Year = GradeLevel.FourthYear, 
            ExamScores = new List<int>{ 75, 84, 91, 39}},
        new Student {FirstName = "Svetlana", LastName = "Omelchenko", ID = 111, 
            Year = GradeLevel.SecondYear, 
            ExamScores = new List<int>{ 97, 92, 81, 60}},
        new Student {FirstName = "Lance", LastName = "Tucker", ID = 119, 
            Year = GradeLevel.ThirdYear, 
            ExamScores = new List<int>{ 68, 79, 88, 92}},
        new Student {FirstName = "Michael", LastName = "Tucker", ID = 122, 
            Year = GradeLevel.FirstYear, 
            ExamScores = new List<int>{ 94, 92, 91, 91}},
        new Student {FirstName = "Eugene", LastName = "Zabokritski", ID = 121,
            Year = GradeLevel.FourthYear, 
            ExamScores = new List<int>{ 96, 85, 91, 60}}
    };
    #endregion

    //Helper method, used in GroupByRange.
    protected static int GetPercentile(Student s)
    {
        double avg = s.ExamScores.Average();
        return avg > 0 ? (int)avg / 10 : 0;
    }



    public void QueryHighScores(int exam, int score)
    {
        var highScores = from student in students
                         where student.ExamScores[exam] > score
                         select new {Name = student.FirstName, Score = student.ExamScores[exam]};

        foreach (var item in highScores)
        {
            Console.WriteLine("{0,-15}{1}", item.Name, item.Score);
        }
    }
}

public class Program
{
    public static void Main()
    {
        StudentClass sc = new StudentClass();
        sc.QueryHighScores(1, 90);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

Aşağıdaki örnek, öğenin tek bir özellik grup anahtarını kullanarak kaynak öğeleri gruplandırmak gösterilmiştir.Bu durumda anahtarı olan bir string, öğrencinin Soyadı.Bir alt dize anahtarı kullanmak mümkündür.Gruplandırma işlemi türü için varsayılan eşitlik karşılaştırıcısı kullanır.

Aşağıdaki yöntem içine yapıştırın StudentClass sınıfı.Arama deyiminde değiştirmek Main yöntemine sc.GroupBySingleProperty().

public void GroupBySingleProperty()
{
    Console.WriteLine("Group by a single property in an object:");

    // Variable queryLastNames is an IEnumerable<IGrouping<string, 
    // DataClass.Student>>. 
    var queryLastNames =
        from student in students
        group student by student.LastName into newGroup
        orderby newGroup.Key
        select newGroup;

    foreach (var nameGroup in queryLastNames)
    {
        Console.WriteLine("Key: {0}", nameGroup.Key);
        foreach (var student in nameGroup)
        {
            Console.WriteLine("\t{0}, {1}", student.LastName, student.FirstName);
        }
    }
}
/* Output:
    Group by a single property in an object:
    Key: Adams
            Adams, Terry
    Key: Fakhouri
            Fakhouri, Fadi
    Key: Feng
            Feng, Hanying
    Key: Garcia
            Garcia, Cesar
            Garcia, Debra
            Garcia, Hugo
    Key: Mortensen
            Mortensen, Sven
    Key: O'Donnell
            O'Donnell, Claire
    Key: Omelchenko
            Omelchenko, Svetlana
    Key: Tucker
            Tucker, Lance
            Tucker, Michael
    Key: Zabokritski
            Zabokritski, Eugene
*/

Aşağıdaki örnek özelliği nesnenin dışındaki bir şey için Grup anahtarı kullanarak kaynak öğeleri gruplandırmak nasıl gösterir.Bu örnekte, Öğrenci soyadının ilk harfini anahtarıdır.

Aşağıdaki yöntem içine yapıştırın StudentClass sınıfı.Arama deyiminde değiştirmek Main yöntemine sc.GroupBySubstring().

public void GroupBySubstring()
{            
    Console.WriteLine("\r\nGroup by something other than a property of the object:");

    var queryFirstLetters =
        from student in students
        group student by student.LastName[0];

    foreach (var studentGroup in queryFirstLetters)
    {
        Console.WriteLine("Key: {0}", studentGroup.Key);
        // Nested foreach is required to access group items.
        foreach (var student in studentGroup)
        {
            Console.WriteLine("\t{0}, {1}", student.LastName, student.FirstName);
        }
    }           
}
/* Output:
    Group by something other than a property of the object:
    Key: A
            Adams, Terry
    Key: F
            Fakhouri, Fadi
            Feng, Hanying
    Key: G
            Garcia, Cesar
            Garcia, Debra
            Garcia, Hugo
    Key: M
            Mortensen, Sven
    Key: O
            O'Donnell, Claire
            Omelchenko, Svetlana
    Key: T
            Tucker, Lance
            Tucker, Michael
    Key: Z
            Zabokritski, Eugene
*/

Aşağıdaki örnek, sayısal aralığı bir grup anahtarı kullanarak kaynak öğeleri gruplandırmak gösterilmiştir.Sorgu sonuçları, yalnızca ilk ve son adı ve ait olduğu Öğrenci frekans aralığı içeren bir anonim tür sonra projeleri.Anonim bir tür tam olarak kullanmak için gerekli olmadığı için kullanılan Student sonuçları görüntülemek için nesne.GetPercentilebir birlik hesaplayan bir yardımcı işlevi bir öğrenci ortalama puanı üzerinde temel alır.Bu yöntem, 0 ile 10 arasında bir tamsayı döndürür.

//Helper method, used in GroupByRange.
protected static int GetPercentile(Student s)
{
    double avg = s.ExamScores.Average();
    return avg > 0 ? (int)avg / 10 : 0;
}

Aşağıdaki yöntem içine yapıştırın StudentClass sınıfı.Arama deyiminde değiştirmek Main yöntemine sc.GroupByRange().

public void GroupByRange()
{            
    Console.WriteLine("\r\nGroup by numeric range and project into a new anonymous type:");

    var queryNumericRange =
        from student in students
        let percentile = GetPercentile(student)
        group new { student.FirstName, student.LastName } by percentile into percentGroup
        orderby percentGroup.Key
        select percentGroup;

    // Nested foreach required to iterate over groups and group items.
    foreach (var studentGroup in queryNumericRange)
    {
        Console.WriteLine("Key: {0}", (studentGroup.Key * 10));
        foreach (var item in studentGroup)
        {
            Console.WriteLine("\t{0}, {1}", item.LastName, item.FirstName);
        }
    }            
}
/* Output:
    Group by numeric range and project into a new anonymous type:
    Key: 60
            Garcia, Debra
    Key: 70
            O'Donnell, Claire
    Key: 80
            Adams, Terry
            Feng, Hanying
            Garcia, Cesar
            Garcia, Hugo
            Mortensen, Sven
            Omelchenko, Svetlana
            Tucker, Lance
            Zabokritski, Eugene
    Key: 90
            Fakhouri, Fadi
            Tucker, Michael
*/

Aşağıdaki örnek, bir Boolean karşılaştırma deyimi kullanarak kaynak öğeleri gruplandırmak gösterilmiştir.Bu örnekte, bir öğrenci ortalama sınav puanı 75'den büyük olup da Boolean deyimin sınar.Tam kaynak öğesinde gerekli değildir çünkü önceki örneklerde olduğu gibi anonim bir tür sonuçları öngörülen.Not anonim tür özelliklerinde bulunan özellikler haline Key üye ve sorgu yürütüldüğünde adı tarafından erişilebilir.

Aşağıdaki yöntem içine yapıştırın StudentClass sınıfı.Arama deyiminde değiştirmek Main yöntemine sc.GroupByBoolean().

public void GroupByBoolean()
{            
    Console.WriteLine("\r\nGroup by a Boolean into two groups with string keys");
    Console.WriteLine("\"True\" and \"False\" and project into a new anonymous type:");
    var queryGroupByAverages = from student in students
                               group new { student.FirstName, student.LastName }
                                    by student.ExamScores.Average() > 75 into studentGroup
                               select studentGroup;

    foreach (var studentGroup in queryGroupByAverages)
    {
        Console.WriteLine("Key: {0}", studentGroup.Key);
        foreach (var student in studentGroup)
            Console.WriteLine("\t{0} {1}", student.FirstName, student.LastName);
    }            
}
/* Output:
    Group by a Boolean into two groups with string keys
    "True" and "False" and project into a new anonymous type:
    Key: True
            Terry Adams
            Fadi Fakhouri
            Hanying Feng
            Cesar Garcia
            Hugo Garcia
            Sven Mortensen
            Svetlana Omelchenko
            Lance Tucker
            Michael Tucker
            Eugene Zabokritski
    Key: False
            Debra Garcia
            Claire O'Donnell
*/

Aşağıdaki örnek, bir anonim tür birden çok değer içeren bir anahtar kapsüllemek için nasıl kullanılacağını gösterir.Bu örnekte, ilk anahtar değeri öğrencinin Soyadı ilk harfidir.İkinci anahtar Öğrenci üzerinde 85 üzerinde ilk incelemesi sonucu olup olmadığını belirten bir Boole değeridir.Herhangi bir özellik anahtarı tarafından grupları sipariş edebilirsiniz.

Aşağıdaki yöntem içine yapıştırın StudentClass sınıfı.Arama deyiminde değiştirmek Main yöntemine sc.GroupByCompositeKey().

public void GroupByCompositeKey()
{

    var queryHighScoreGroups =
        from student in students
        group student by new { FirstLetter = student.LastName[0], 
            Score = student.ExamScores[0] > 85 } into studentGroup
        orderby studentGroup.Key.FirstLetter
        select studentGroup;

    Console.WriteLine("\r\nGroup and order by a compound key:");
    foreach (var scoreGroup in queryHighScoreGroups)
    {
        string s = scoreGroup.Key.Score == true ? "more than" : "less than";
        Console.WriteLine("Name starts with {0} who scored {1} 85", scoreGroup.Key.FirstLetter, s);
        foreach (var item in scoreGroup)
        {
            Console.WriteLine("\t{0} {1}", item.FirstName, item.LastName);
        }
    }
}
/* Output:
    Group and order by a compound key:
    Name starts with A who scored more than 85
            Terry Adams
    Name starts with F who scored more than 85
            Fadi Fakhouri
            Hanying Feng
    Name starts with G who scored more than 85
            Cesar Garcia
            Hugo Garcia
    Name starts with G who scored less than 85
            Debra Garcia
    Name starts with M who scored more than 85
            Sven Mortensen
    Name starts with O who scored less than 85
            Claire O'Donnell
    Name starts with O who scored more than 85
            Svetlana Omelchenko
    Name starts with T who scored less than 85
            Lance Tucker
    Name starts with T who scored more than 85
            Michael Tucker
    Name starts with Z who scored more than 85
            Eugene Zabokritski
*/

Kod Derleniyor

Kopyalama ve yapıştırma içine sınamak istediğiniz her bir yöntemi StudentClass sınıfı.Yöntemi çağıran bir ifade ekleyin Main yöntemi ve F5 tuşuna basın.

Uygulama için bu yöntemleri uyum LINQ sürümü 3.5 veya 4 gerektirdiğini unutmayın .NET Framework, proje System.Core.dll ve kullanarak bir başvuru içermelidir System.Linq için yönerge.LINQ sql, XML LINQ ve LINQ DataSet türleri için gerekli ek yönergeleri ve başvuruları kullanma.Daha fazla bilgi için bkz. Nasıl yapılır: bir LINQ projesi oluşturma.

Ayrıca bkz.

Görevler

Nasıl yapılır: bir alt sorgu bir gruplandırma işlemi (C# Programlama Kılavuzu) gerçekleştirmek

Nasıl yapılır: (C# Programlama Kılavuzu) iç içe grup oluşturma

Başvuru

GROUP BY (C# Reference)

Anonim türleri (C# Programlama Kılavuzu)

GroupBy

IGrouping<TKey, TElement>

Kavramlar

LINQ sorgu ifadelerini (C# Programlama Kılavuzu)

Verileri gruplandırma