c# Linq常用的小技巧

2020-07-03 12:01:28王旭

前言

在C#语言发展的历史长河中,Linq是一个极其重要的里程碑!

Linq的语法吸取了SQL语法的特性,同时配合Lambda表达式又可以使代码更加优雅!
可以这么说,用好了Linq可以大大提高程序猿的工作效率,毕竟我们的日常工作本质就是对数据的处理。经历了十多年的发展,现在微软自带的内库包含的Linq函数已经非常多了,几乎满足我们日常工作。

下面根据一个对科室数据操作的例子,就个人觉得日常高频使用的Linq小技巧贴出来,权当是做个笔记了。

初始化数据

定义模型

这里定义一个科室对象,模拟我们日常工作的科室信息。科室存在层级关系,还有一个员工数量的属性。模型如下:

 public class DepartmentDto
 {
  public int Id { get; set; }   

  public int? ParentId { get; set; }

  public string Name { get; set; }

  public string TelPhone { get; set; }
 
  public string Address { get; set; }

  public string Remark { get; set; }
   
  public int EmployeeNumber { get; set; }
 }

初始化数据

  public List<DepartmentDto> InitDepartmentData()
  {
   List<DepartmentDto> lst = new List<DepartmentDto>();
   lst.AddRange(new DepartmentDto[] {
    new DepartmentDto() {
      Address ="一马路XX号",
      Id=1,
      Name="一级一号科室",
      Remark="",
      TelPhone="0731-6111111",
      EmployeeNumber=3,
    },
    new DepartmentDto() {
      Address ="二马路XX号",
      Id=2,
      Name="一级二号科室",
      Remark="",
      TelPhone="0731-6111111",
      EmployeeNumber=4,
    },
    new DepartmentDto() {
      Address ="三马路XX号",
      Id=3,
      Name="一级三号科室",
      Remark="",
      TelPhone="0731-6222222",
      EmployeeNumber=6,
    },
    new DepartmentDto() {
      Address ="一马路XX号",
      ParentId=1,
      Id=4,
      Name="二级一号科室",
      Remark="",
      TelPhone="0731-6222222",
      EmployeeNumber=7,
    },
    new DepartmentDto() {
      Address ="二马路XX号",
      ParentId=2,
      Id=5,
      Name="二级二号科室",
      Remark="",
      TelPhone="0731-6222222",
      EmployeeNumber=5,
    },
   });
   return lst;
  }

获取未存在父级科室的科室集合

 List<DepartmentDto> lstDepartItems = InitDepartmentData();
   //1、获取未存在父级科室的科室集合 1、2、3   
   List<DepartmentDto> notExistsParentDepartmentIdLst = lstDepartItems
    .Where(p => !p.ParentId.HasValue)
    .ToList();

这里比较简单,Where内校验下ParentId的值为空即可,不使用Linq则需要自己手写一个循环搞定,如下:

 List<DepartmentDto> notExistsParentDepartmentIdLst_1 = new List<DepartmentDto>();
 foreach (DepartmentDto department in lstDepartItems)
 {
   if (!department.ParentId.HasValue)
    notExistsParentDepartmentIdLst_1.Add(department);
 }