一、投影:把集合中的每一项转换为另外一种类型。
在linq中,select 子句可以指定将在执行查询时产生的值的类型。 该子句的结果将基于前面所有子句的计算结果以及 select 子句本身中的所有表达式。 查询表达式必须以 select 子句或 group 子句结束。
Select操作包括7种形式,分别为简单用法、匿名类型形式、条件形式、筛选形式、嵌套类型形式、本地方法调用形式、Distinct形式.。
//映射规则 只取年龄
IEnumerable<int> items1=list.Select(x => x.Age);
foreach (int i in items1)
{
Console.WriteLine(i);
}
//也可以多种条件重复使用
IEnumerable<string> items1 = list.Select(x => x.Age+" "+x.Name);
foreach (string i in items1)
{
Console.WriteLine(i);
}
//也可以与where语句结合
IEnumerable<string> items2 = list.Where(e=>e.Age>30&&e.Gender==true).Select(x => x.Age + " " + x.Name);
foreach (string i in items2)
{
Console.WriteLine(i);
}
二、一些Linq的组合嵌套使用
//用一个新类来分组,值都放到这个组里面
IEnumerable<Dog> items3 = list.Select(e => new Dog { NickName = e.Name, Age = e.Salary });
foreach (Dog dog in items3)
{
Console.WriteLine($"{dog.NickName},{dog.Age}");
}
//利用var简化编程
var items2 = list.Select(e => new
{
XingMing = e.Name,
NingLing = e.Age,
Xingbie = e.Gender ? "男":"女"
}) ;
foreach (var item in items2)
{
Console.WriteLine(item.XingMing+item.Xingbie+item.NingLing);
}
//结合groupby+投影+匿名类型
var items = list.GroupBy(e => e.Age).Select(g => new
{
nianling = g.Key,
Maxs = g.Max(e => e.Salary),
Mins = g.Min(e => e.Salary),
rengshu = g.Count(),
name = g.First().Name
});
foreach (var i in items)
{
Console.WriteLine(i.nianling+","+i.Maxs+","+i.Mins+","+i.rengshu+","+i.name);
}
//获得工资大于6000的数据,使用ToArray转换成数组或者list
IEnumerable<Employee> items1 = list.Where(e => e.Salary > 6000);
Employee[] employees = items1.ToArray();
items1.ToList();*/
//获取ID>2的数据,然后按照Age分组,然后取出前三条,最后在投影取得年龄,人数,平均工资
var items= list.Where(e => e.ID > 2).GroupBy(e => e.Age).OrderBy(g => g.Key).Take(3).Select(g => new
{
nianling = g.Key,
rs = g.Count(),
pinjunxinzhi = g.Average(e => e.Salary)
});
foreach(var i in items)
{
Console.WriteLine(i.rs + "," + i.nianling + "," + i.pinjunxinzhi); ;
}
附录:C# LINQ 中Count()方法
LINQ代码库中的Count方法作为数据统计的关键方法,经常被使用。在统计数据时候,Count方法是否每次都要遍历整个序列来获取序列元素个数,Count方法内容是否存在优化机制。为了更好的了解该方法的工作原理,我们从源码的角度对其进行分析。