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 = , Name = "小日", Age = },
new PerInfo{Id = , Name = "小日月", Age = },
new PerInfo{Id = , Name = "张三四", Age = },
new PerInfo{Id = , Name = "李四五六七", Age = }
}; //使用布尔值作为键将结果划分成两个组
//以‘17’为界限进行分组,大于等于17的一组,小于17的一组
var booleanQuery1 = from p in perInfos
group p by p.Age >= ; 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[]; Console.WriteLine("\nQuery2:");
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的
group p by lenName into g//使用 into 关键字来启用临时标识符 g,该标识符具有推断类型 IGroupi
where g.Count() > //筛选出每组数量大于1 的组
select g;
Console.WriteLine("\nQuery3:");
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