.NET之LINQ笔记(常用方法)

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("*************");
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值