distinct返回null报错_C#之集合常用扩展方法与Linq

一、集合的常用扩展方法(lambda的方式)

1.Where() 根据条件选择数据

2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类

3.Max() 根据条件选择最大值

4.Min() 根据条件选择最小值

5.OrderBy() 根据条件升序排序

如果升序中Id都为1,那么就根据第二个条件进行升序排序,使用ThenBy

ThenByDescending()紧接着倒序排序

6.First() 获取第一个(如果不存在则报错)

7.FirstOrDefault() 获取第一个,如果不存在则返回null或默认值

8.Single() 获取唯一一个,如果没有或者多个则报异常

9.SingleOrDefault() 获取唯一一个,如果没有则返回默认值,如果多个则报错

10.Any() 判断集合中是否包含元素,如果有返回true,否则返回false。一般比Count效率高。因为Any()只要查询到数据就返回,Count是统计数据的数量。Any还可以指定条件表达式。

11.Distinct() 去除重复数据

(1)int类型的集合:List。

(2)string类型的集合:List

(3)对于自定义类的集合去重复

使用Linq中Distinct方法内进行比较的是对象引用,判断的是对象是否引用同一个对象,而不是对象的属性。因此我们使用对象集合使用Distinct方法时要使用重载

Distinct(this IEnumerable source, IEqualityComparer comparer);

要使用这个方法,重写IEqualityComparer接口,再使用Distinct方法:

由于直接获取对象的HashCode,用HashCode进行比较的速度比Equals方法更快,因此IEqualityComparer内部会再使用Equals前先使用GetHashCode方法,再两个对象的HashCode都相同时即判断对象相同。

而当两个对象HashCode不相同时,Equals方法就会被调用,对要比较的对象进行判断。由于在List集合中两个引用实际上是两个不同的对象,因此HashCode必定不相同,所以要触发Equals方法,只需要改GetHashCode,让它返回相同的常量。

12.Skip(n)跳过前n条数据,Take(m)获取最多m条数据,如果不足m条也不会报错。

13.Except(item1) 排除当前集合中在item1中存在的数据。

如果是自定义集合,需要同Distinct方法一样实现IEqualityComparer接口

14.Union(item1)把当前集合和item中元素组合(求并集)

自定义集合实现IEqualityComparer

15.Intersect(item1) 把当前集合和item中元素求交集

16.GroupBy() 分组(其中Key值是分组返回值)

按照string类型进行返回值

17.SelectMany() 把集合中每个对象的集合属性的值重新拼接为一个新的集合(不能去除重复数据)

18.Join() 联合查询(可以查询两个表某个属性相同的数据)

使用扩展方法,本人只找到添加一个条件查询,没有找到添加多个条件查询,但是使用Linq方式的Join可以使用添加多个条件查询。

二、Linq写法

上面介绍的是lambda的方式写的,下面介绍的是Linq的写法。两种方法可以相互替代,没有哪个好哪个坏的区别。在编译器编译的时候,使用Linq的写法最终都被编译成了lambda的方式的写法(通过反编译工具可以看出)

建议:需要join等复杂用法的时候Linq更易懂,一般的时候lambda方式的写法更清晰、紧凑。同时这两种写法可以混合书写。

必须是:from 变量 in 集合,并且是select xxx结尾

1.Where(s=>s.Id>2)写法:

2.Select(s=>new GetData(){Id=s.Id,Name=s.Name})写法:

3.OrderBy(s=>s.Id). ThenBy(s=>s.Name.Length);写法

4.Join联合查询(两个集合的条件判断相等不能使用”==”,而是使用equals)

一个条件的联合查询

多个条件查询

5.group by 分组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值