1、基础方法
Where()方法:方法中使用匿名方法过滤符合条件的数据。
Count()方法:获取数据条数。
Any()方法:是否至少有一条数据满足条件。
Single()方法:有且只有一条满足要求的数据,如果没有或者超过一条都会报异常。
SingleOrDefault()方法:最多只有一条满足要求的数据,如果没有就返回null,如果超过一条就会报异常。
First()方法:返回第一条。如果一条都没有,会报异常;如果有多条则返回第一条。FirstOrDefault()方法:返回第一条或默认值。如果一条都没有返回默认值,如果有多条返回第一条
Skip(n)方法:跳过n条数据。
Take(n)方法:获取n条数据。
//声明一个学生成绩类
public class ScoreInfo
{
public int Id { get; set; }
public string Name { get; set; }
public string Subject { get; set; }
public string Sex { get; set; }
public int Score { get; set; }
}
static void Main(string[] args){
//初始一些值
List<ScoreInfo> scoreList = new List<ScoreInfo>()
{
new ScoreInfo(){ Id=1, Name="张三", Score=98, Subject="语文", Sex="男" },
new ScoreInfo(){ Id=2, Name="李四", Score=90, Subject="数学", Sex="男" },
new ScoreInfo(){ Id=3, Name="王五", Score=88, Subject="语文", Sex="女" },
new ScoreInfo(){ Id=4, Name="赵柳", Score=95, Subject="英语", Sex="女" },
new ScoreInfo(){ Id=5, Name="李佳", Score=60, Subject="语文", Sex="男" },
new ScoreInfo(){ Id=6, Name="柳公权", Score=70, Subject="数学", Sex="女" },
new ScoreInfo(){ Id=7, Name="柳先开", Score=45, Subject="数学", Sex="女" },
new ScoreInfo(){ Id=8, Name="论文集", Score=45, Subject="数学", Sex="男" }
};
List<Student> studentList = new List<Student>()
{
new Student(){Id = 1,Name="张三" },
new Student(){Id = 2,Name="王五" },
new Student(){Id = 3,Name="柳先开" }
};
//获取成绩大于80的数据
var whereList = scoreList.Where(c => c.Score > 80);
//成绩及格的条数
var count = scoreList.Where(c => c.Score > 60).Count();
//是否包含 返回结果true
var anyRet = scoreList.Any(c => c.Name == "柳先开");
//获取一条数据
var single = scoreList.Single(c => c.Id == 1);
var singleDef = scoreList.SingleOrDefault(c => c.Id == 1);
//获取集合中的首条数据
var firstList = scoreList.First(c => c.Subject == "数学");
var firstListDef = scoreList.First(c => c.Subject == "数学");
//集合的高级用法
//成绩信息与学生信息的交集 根据姓名过滤。会找出Id为1、3、7的值。
var unionList = scoreList.Where(c => studentList.Any(s => s.Name == c.Name)).ToList();
//如果要找出不在集合studentList中的值则是一下写法。会找出Id为2、4、5、6的值。实际项目的应用场景,在批量插入数据时,去重数据库中存在的数据。
var noList = scoreList.Where(c => !studentList.Any(s => s.Name == c.Name)).ToList();
}
2、排序用法
OrderBy()方法:对数据正序排序。
ThenBy()方法:实现次要字段正序排序。
OrderByDescending()方法:对数据倒序排序。
ThenByDescending()方法:实现次要字段降序排序。
//根据成绩正序排序
var orderby = scoreList.OrderBy(c => c.Score).ToList();
//先根据成绩正序排序 再根据性别正序排序
var orderthen = scoreList.OrderBy(c => c.Score).ThenBy(c => c.Sex).ToList();
//根据成绩倒序排序
var orderbyDes = scoreList.OrderByDescending(c => c.Score).ToList();
//先根据成绩正序排序 再根据性别倒序排序
var orderbyDesthen = scoreList.OrderBy(c => c.Score).ThenByDescending(c => c.Sex).ToList();
3、聚合函数、分组
Max():获取最大值。
Min():获取最小值。
Average():获取平均值。
int max = scoreList.Max(c => c.Score); //结果:98
int mit = scoreList.Min(c => c.Score); //结果:45
double avg = scoreList.Average(c => c.Score); //结果:73.875
GroupBy()方法:参数是分组条件表达式(c => c.Sex),多字段分组时的条件表达式(c => new { c.Id, c.Name })。返回值为IGrouping<TKey, TSource>类型的泛型IEnumerable,也就是每一组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中key属性表示这一组的分组数据的值。
//根据成绩分组
IEnumerable<IGrouping<int, ScoreInfo>> scoreInfos = scoreList.GroupBy(c =>c.Score);
foreach (IGrouping<int, ScoreInfo> group in scoreInfos)
{
Console.WriteLine(group.Key);//分组的字段值Key
foreach (var item in group)
{
Console.WriteLine("Id:"+item.Id.ToString() +",Name:"+ item.Name +",Score:"+ item.Score.ToString());
}
Console.WriteLine("-------------------------");
Console.WriteLine();
}
//多个字段分组
var scores = scoreList.GroupBy(c => new { c.Score,c.Sex });
输出结果:
分组的其它用法:
//根据成绩排序,再根据性别成绩分组,取出分组中的第一条数据。
var groupFirst = scoreList.OrderByDescending(c => c.Score).GroupBy(c => new { c.Sex, c.Score }, (key, group) => group.First()).ToList();
//根据成绩分组之后,再投影成一个新集合
var ret = groupFirst.GroupBy(c => c.Score, (key, group) => group.Select(s => new { s.Id, s.Name, s.Score })).ToList();