猿教程 Logo

Linq分组运算符:GroupBy & ToLookup

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

分组运算符执行与SQL查询的GroupBy子句相同的操作。 分组运算符基于给定的键创建一组元素。 该组被包含在实现IGrouping<TKey,TSource>接口的特殊类型的集合中,其中TKey是其中已经形成组的关键字值,并且TSource是与分组关键字值匹配的元素的集合。

分组运算符描述
GroupByGroupBy运算符根据某些键值返回一组元素。 每个组由IGrouping <TKey,TElement>对象表示。
ToLookupToLookup与GroupBy相同; 唯一的区别是GroupBy的执行被延迟,而ToLookup执行是立即的。

GroupBy:

GroupBy运算符根据某个键值从给定集合中返回一组元素。 每个组由IGrouping <TKey,TElement>对象表示。 此外,GroupBy方法有八个重载方法,因此您可以根据您在方法语法中的要求使用适当的扩展方法。

GroupBy运算符的结果是组的集合。 例如,GroupBy从Student集合返回IEnumerable <IGrouping <TKey,Student >>:


查询语法中的GroupBy:

以下示例创建一组具有相同年龄的学生。 相同年龄的学生将在同一集合中,每个分组的集合将具有一个key和内部集合,其中key将是年龄,内部集合将包括年龄与key匹配的学生。

相关实例:

IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Abram" , Age = 21 } 
    };

var groupedResult = from s in studentList
                    group s by s.Age;

//iterate each group 
foreach (var ageGroup in groupedResult)
{
    Console.WriteLine("Age Group: {0}", ageGroup .Key); //Each group has a key 
             
    foreach(Student s in ageGroup) // Each group has inner collection
        Console.WriteLine("Student Name: {0}", s.StudentName);
}

运行结果:

AgeGroup: 18 
StudentName: John 
StudentName: Bill 
AgeGroup: 21 
StudentName: Steve 
StudentName: Abram 
AgeGroup: 20 
StudentName: Ram

从上面的例子可以看到,你可以使用一个'foreach'循环迭代组,其中每个组包含一个键和内部集合。 下图显示了调试视图中的结果。


在VB.Net中使用“Into Group”与“Group By”子句,如下所示。

相关实例:

Dim groupQuery = From s In studentList
                 Group By s.Age Into Group

For Each group In groupQuery
    Console.WriteLine("Age Group: {0}", group.Age) // Each group has key property name
    
    For Each student In group.Group // Each group has inner collection
        Console.WriteLine("Student Name: {0}", student.StudentName)
    Next
Next

请注意,每个组都将具有执行组的属性名称。 在上面的例子中,我们使用Age来形成一个组,所以每个组都有“Age”属性名,而不是“Key”作为属性名。

运行结果:

AgeGroup: 18 
StudentName: John 
StudentName: Bill 
AgeGroup: 21 
StudentName: Steve 
StudentName: Abram 
AgeGroup: 20 
StudentName: Ram

方法语法中的GroupBy:

GroupBy()扩展方法在方法语法中的工作方式相同。 在GroupBy扩展方法中指定键选择器字段名称的lambda表达式。

相关实例:

IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Abram" , Age = 21 } 
    };

var groupedResult = studentList.GroupBy(s => s.Age);

foreach (var ageGroup in groupedResult)
{
    Console.WriteLine("Age Group: {0}", ageGroup.Key);  //Each group has a key 
             
    foreach(Student s in ageGroup)  //Each group has a inner collection  
        Console.WriteLine("Student Name: {0}", s.StudentName);
}

相关实例:

Dim groupQuery = studentList.GroupBy(Function(s) s.Age)
        
For Each ageGroup In groupQuery
            
    Console.WriteLine("Age Group: {0}", ageGroup.Key)  //Each group has a key 
            
    For Each student In ageGroup.AsEnumerable()  //Each group has a inner collection
        Console.WriteLine("Student Name: {0}", student.StudentName)
    Next
Next

运行结果:

AgeGroup: 18 
StudentName: John 
StudentName: Bill 
AgeGroup: 21 
StudentName: Steve 
StudentName: Abram 
AgeGroup: 20 
StudentName: Ram

ToLookup

ToLookup与GroupBy相同; 唯一的区别是GroupBy的执行被延迟,而ToLookup的执行是立即的。 此外,ToLookup仅适用于方法语法。 查询语法中不支持ToLookup。

相关实例:

IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Abram" , Age = 21 } 
    };

var lookupResult = studentList.ToLookup(s => s.age);

foreach (var group in lookupResult)
{
    Console.WriteLine("Age Group: {0}", group.Key);  //Each group has a key 
             
    foreach(Student s in group)  //Each group has a inner collection  
        Console.WriteLine("Student Name: {0}", s.StudentName);
}

相关实例:

Dim loopupResult = studentList.ToLookup(Function(s) s.Age)
要点
  1. GroupBy&ToLookup返回一个集合,它具有基于键字段值的键和内部集合。 

  2. GroupBy的执行被延迟,而ToLookup的执行是立即的。 

  3. LINQ查询语法可以使用GroupBy或Select子句结束。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-grouping-operator-groupby-tolookup.html