LINQ查询表达式---------group子句
LINQ表达式必须以from子句开头,以select或group子句结束。使用guoup子句来返回元素分组后的结果。group 子句返回一个 IGrouping<TKey, TElement> 对象序列(实质上是列表的列表)。TKey是键的对象类型,在用于group子句的时候,它一般用于存储分组的键值;TElement是指的对象类型,用于存储分组的结果。
class Program { public class PerInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } static void Main(string[] args) { List<PerInfo> perInfos = new List<PerInfo> { new PerInfo{Id = 1, Name = "小日", Age = 15}, new PerInfo{Id = 2, Name = "小日月", Age = 17}, new PerInfo{Id = 3, Name = "张三四", Age = 21}, new PerInfo{Id = 4, Name = "李四五六七", Age = 23} }; //使用布尔值作为键将结果划分成两个组 //以‘17’为界限进行分组,大于等于17的一组,小于17的一组 var booleanQuery1 = from p in perInfos group p by p.Age >= 17; Console.WriteLine("Query1:"); foreach (var key in booleanQuery1) { Console.WriteLine(" 分组键{0},{1}", key.Key, key.Key == true ? "Age大于等于17" : "Age小于17"); foreach (var item in key) { Console.WriteLine(" {0} {1}", item.Name, item.Age); } } //使用字符串作为键将结果划分为两个组 //Name第一个字相同的为一组 var booleanQuery2 = from p in perInfos group p by p.Name[0]; Console.WriteLine(" Query2:"); foreach (var key in booleanQuery2) { Console.WriteLine(" 分组键{0}", key.Key); foreach (var item in key) { Console.WriteLine(" {0} {1}", item.Name, item.Age); } } //group by into //into 关键字来启用临时标识符 var booleanQuery3 = from p in perInfos let lenName = p.Name.Length //let子句用来保存表达式的结果 where lenName > 2 //只筛选出名字长度大于2的 group p by lenName into g//使用 into 关键字来启用临时标识符 g,该标识符具有推断类型 IGroupi where g.Count() > 1 //筛选出每组数量大于1 的组 select g; Console.WriteLine(" Query3:"); foreach (var key in booleanQuery3) { Console.WriteLine(" 分组键{0}", key.Key); //这里的分组键是名字的长度 foreach (var item in key) { Console.WriteLine(" {0} {1}", item.Name, item.Age); } } Console.ReadLine(); } }
输出结果: Query1: 分组键False,Age小于17 小日 15 分组键True,Age大于等于17 小日月 17 张三四 21 李四五六七 23 Query2: 分组键小 小日 15 小日月 17 分组键张 张三四 21 分组键李 李四五六七 23 Query3: 分组键3 小日月 17 张三四 21