LINQ
LINQ(Language-Integrated Query,语言集成查询)是微软在.NET Framework 3.5版本引入的新功能,它能够将查询功能直接引入.Net Framework所支持的编程语言中。
测试数据
class Employee
{
public int Id { get; set; } // ID
public string Name { get; set; } // 昵称
public int Age { get; set; } // 年龄
public int Gender { get; set; } // 性别
public int Salary { get; set; } // 工资
public Employee() { }
public override string ToString()
{
return $"Id={Id},Name={Name},Age={Age},Gender={Gender},Salary={Salary}";
}
}
private static List<Employee> GetEmployeeList()
{
List<Employee> employees = new List<Employee>();
employees.Add(new Employee { Id=1, Name="jack", Age=18, Gender=1, Salary =10000 });
employees.Add(new Employee { Id=1, Name="jim", Age=20, Gender=0, Salary =8000 });
employees.Add(new Employee { Id=1, Name="lily", Age=14, Gender=1, Salary =6000 });
employees.Add(new Employee { Id=1, Name="lucy", Age=30, Gender=1, Salary =30000 });
employees.Add(new Employee { Id=1, Name="kimi", Age=21, Gender=0, Salary =20000 });
employees.Add(new Employee { Id=1, Name="zack", Age=18, Gender=1, Salary =3000 });
return employees;
}
条件筛选
Where
Where 每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。
List<Employee> employee = GetEmployeeList();
// 查询年龄大于18的 返回值是 IEnumerable<T>
IEnumerable<Employee> item1 = employee.Where(x => x.Age > 18);
foreach (Employee item in item1)
{
Console.WriteLine(item);
}
Count
获取满足条件的条数
List<Employee> employee = GetEmployeeList();
// 年龄大于20的条数
int count = employee.Count(x=> x.Age > 20);
Console.WriteLine(count);
Any
判断集合是否至少有一条数据
List<Employee> employee = GetEmployeeList();
// 判断集合是否至少有一条数据(无条件)
bool isemployee = employee.Any();
// 有条件
bool isemployee2 = employee.Any(x=> x.Name == "xiaoke");
Console.WriteLine(isemployee);
Console.WriteLine(isemployee2);
Single
有且只有一条满足要求的数据
List<Employee> employee = GetEmployeeList();
IEnumerable<Employee> e2 = employee.Where(x => x.Name == "jack");
// 有一条满足的数据,超过一条报错,没有满足的数据也报错
Employee employee2 = e2.Single();
Employee employee3 = employee.Single(x => x.Name == "kimi");
Console.WriteLine(employee2);
Console.WriteLine(employee3);
SingleOrDefault
没有满足的数据返回默认值 null
List<Employee> employee = GetEmployeeList();
// 如果数据不存在就返回 null
Employee item = employee.SingleOrDefault(x => x.Name == "xiaoke");
Console.WriteLine(item);
FIrst
有满足条件的数据,返回第一条
List<Employee> employee = GetEmployeeList();
// 要是没有满足的数据报错
Employee item = employee.First(x => x.Age > 18);
Console.WriteLine(item);
FIrstOrDefault
有满足条件的数据,返回第一条,没有返回默认值 null
List<Employee> employee = GetEmployeeList();
Employee item = employee.FirstOrDefault(x => x.Name == "xiaoke");
Console.WriteLine(item);
排序
Order
对数据做升序排序
List<Employee> employee = GetEmployeeList();
// 对年龄进行升序排序
IEnumerable<Employee> list = employee.OrderBy(x => x.Age);
foreach (Employee emp in list)
{
Console.WriteLine(emp);
}
OrderByDescending
对数据做降序排序
List<Employee> employee = GetEmployeeList();
// 对年龄进行降序排序
IEnumerable<Employee> list1 = employee.OrderByDescending(x => x.Age);
foreach (Employee emp in list1)
{
Console.WriteLine(emp);
}
多规则排序
可以在Order、OrderBylDescending 后继续写 ThenBy、ThenByDescending
千万不要写成 OrderBly
List<Employee> employee = GetEmployeeList();
// 多规则排序
// 优先按照Age排序,如果Age相同再用 Salary 排序
IEnumerable<Employee> list = employee
.OrderBy(x => x.Age)
.ThenByDescending(x => x.Salary);
foreach (Employee emp in list)
{
Console.WriteLine(emp);
}
限制结果
Skip/Task
Skip 跳过n条数据,Task 获取n条数据(可以单独使用)
List<Employee> employee = GetEmployeeList();
// 跳过2条,获取3条数据
IEnumerable<Employee> list = employee.Skip(2).Take(3);
foreach (Employee emp in list)
{
Console.WriteLine(emp);
}
聚合函数
Max
获取最大值
List<Employee> employee = GetEmployeeList();
// 获取最高的工资
int MaxSalary = employee.Max(x => x.Salary);
Console.WriteLine(MaxSalary);
Min
获取最小值
List<Employee> employee = GetEmployeeList();
// 获取年龄最小的
int MinAge = employee.Min(x => x.Age);
Console.WriteLine(MinAge);
Average
获取平均值
List<Employee> employee = GetEmployeeList();
// 获取年龄平均值
double AverageAge = employee.Average(x => x.Age);
Console.WriteLine(AverageAge);
Sum
获取总和
List<Employee> employee = GetEmployeeList();
// 获取工资总和
double SumSalary = employee.Sum(x => x.Salary);
Console.WriteLine(SumSalary);
分组
GroupBy
方法参数是分组条件表达式,返回值是 IGrouping<Tkey,TSource> 类型的泛型,IEnumerable 也就是每一组以一个 IGrouping对象进行形式返回
List<Employee> employee = GetEmployeeList();
// 对年龄进行分组 返回值是 IGrouping
IEnumerable<IGrouping<int,Employee>> list = employee.GroupBy(x => x.Age);
foreach(IGrouping<int, Employee> g in list)
{
// Key是分组年龄值
Console.WriteLine($"年龄={g.Key}");
// 还可以进行数据聚合
Console.WriteLine("最大工资是:"+g.Max(x=>x.Salary));
Console.WriteLine("最大总和是:"+g.Sum(x=>x.Salary));
Console.WriteLine("平均工资是:"+g.Average(x=>x.Salary));
// g 是 IEnumerable<Employee> 集合
foreach (Employee e in g)
{
Console.WriteLine(e);
}
Console.WriteLine("*************");
}