07-03 C# Linq扩展方法和表达式

25 篇文章 2 订阅

前言

在C#中,从功能上Linq可以分为两类:linq to object 和 linq to provider(如xml);从语法上可以分为linq 表达式和linq扩展方法,linq表达式和linq扩展方法本质相同,没有任何区别。

一、Linq To Object

linq to object针对IEnumerable类型数据。

  • IEnumerable类型数据:可以理解为内存数据
  • IQueryable类型数据:可以内存数据,也可以是数据库数据
    注意: IEnumerable类型的扩展的方法和IQueryable类型扩展方法本质不同,IQueryable类型扩展方法是将可变逻辑封装成表达式目录树(数据结构)

1、linq扩展方法

(1)本质

	把不变的逻辑封装起来,把可变的逻辑封装成委托来传递,让开发者只关注自己的核心业务逻辑。

(2)延伸

  • Linq To Sql:打开数据库连接、查询数据(不变的逻辑)封装起来,把sql拼接(可变的逻辑)封装成委托。
  • Linq To Xml:数据解析(不变的逻辑)封装起来,筛选条件(可变逻辑)封装成委托传递
  • Linq To Redis:把固定的逻辑封装起来,可变的逻辑封装成委托(未实现)
  • Linq To Cache:同上(未实现)
  • Linq To Json:同上(未实现)
  • Linq To Everything:同上(未实现)

因此:Linq是一种封装思想,对于使用者而言,不用关注内部实现,只需要调用即可

(3)常用扩展方法

<1> Where

在这里插入图片描述

<2> Select(投影)

Select被称作投影,可以基于数据源投影出一个新的对象(实体对象或者匿名对象均可),以便保留有效的属性或者字段
在这里插入图片描述

<3> First和FirstOrDefault

查询第一条数据

  • First:如果集合是空的,会报错
  • FirstOrDefault:如果集合是空的,不会报错,返回默认值
    在这里插入图片描述
<4> Last和LastOrDefault

查询最后一条数据

  • Last:如果集合是空的,会报错
  • LastOrDefault:如果集合是空的,不会报错,返回默认值
    在这里插入图片描述
<5> Single和SingleOrDefault

查询第一条数据

  • Single:如果集合是空的,会报错
  • SingleOrDefault:如果集合是空的,不会报错,返回默认值
    在这里插入图片描述
<6> Union和Concat

合并两个集合

  • Union:会自动去重
  • Concat:保留重复的
    在这里插入图片描述
<7> Except 取差集

在这里插入图片描述

<8> Count、Any和All
  • Count:计算集合总条数
  • Any:判断集合中是否存在任意一个元素符合条件
  • All:判断集合中所有元素是否符合条件
    在这里插入图片描述
<9> Skip和Take 分页
  • Skip:从起始位置(索引为0)起跳过指定的元素个数
  • Take:读取指定的条数
    在这里插入图片描述
<10> SkipWhile和TakeWhile
  • SkipWhile:从起始位置开始忽略指定元素,直到匹配到不符合条件的元素就停止忽略,返回后面的结果。
  • TakeWhile:从起始位置读取符合条件的元素,一旦遇到不符合条件的元素就立即停止读取,后面的也不再读取。
    在这里插入图片描述
<11> Distinct 去重

在这里插入图片描述

<12> ToDictionary 字典转换
将集合转换成字典

注意:key不能重复,也就是说集合的元素不能重复
在这里插入图片描述
也可以自定义key,value
在这里插入图片描述

<13> Range和Repeat

列表生成式:用于生成集合
在这里插入图片描述

<14> GroupBy 分组

在这里插入图片描述

<15>OrderBy、OrderByDescending和ThenBy、ThenByDescending
  • OrderBy:正向排序
  • OrderByDescending:逆向排序
  • ThenBy和ThenByDescending:配合OrderBy、OrderByDescending做多条件排序
    在这里插入图片描述
<15> DefaultEmpty 空替换

没有查到指定元素的时候可以用默认值代替,默认值可以自定义
在这里插入图片描述

<16> SequenceEqual 集合相等

判断两个集合对应的各个位置元素是否相等(个数不等,返回值必为false)
在这里插入图片描述

<17> Zip 拉链(配对)

将两个集合像拉链一样,按照位置索引对应配对起来,如果两个集合元素数量不同,多出来的元素会被舍弃。
在这里插入图片描述

<18> OfType和Cast

类型过滤与转换
在这里插入图片描述
在这里插入图片描述

<19> ToLookup 索引式查找

返回可索引查找的数据结构,根据指定条件计算结果(键)将集合分组,并按条件计算结果(键)进行索引。
在这里插入图片描述

<20> SelectMany 集合降维

在这里插入图片描述

笛卡尔积运算

在这里插入图片描述

多维数组笛卡尔积运算

在这里插入图片描述

<21> Aggregate 聚合

在这里插入图片描述

<22> Join (inner join)

在这里插入图片描述

<23> GroupJoin

以left join 为例
在这里插入图片描述

<24> 其他

后续完善。。。。

2、Linq表达式

(1)本质

linq表达式和linq扩展方法本质相同,没有区别,linq表达式最终会被编译器成linq扩展方法。

编译前
在这里插入图片描述
编译后
在这里插入图片描述

(2)常用表达式

<1> from … in … where … select …
List<int> list1 = new List<int> { 1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 0 };
List<int> list2 = new List<int> { 1, 20, 30, 4, 50, 5, 60, 6, 70, 8, 90, 9, 0, 100 };

var result = from item in list1
             where item > 3
             select item;
Console.WriteLine(string.Join(',', result));

在这里插入图片描述
等同于where扩展方法

<2> join(相当于sql中的inner join)

在这里插入图片描述
等同于Join 扩展方法
在这里插入图片描述

<3> join into (Left join)

在这里插入图片描述
等同于扩展方法GroupJoin
在这里插入图片描述

<4> join into (Right join)

在这里插入图片描述

<5> Cross Join

在这里插入图片描述

<6> Full Outer Join

在这里插入图片描述
在这里插入图片描述

<7> 多关键字连接

在sql查询中,如果同时需要多个字段连接两张表的时候,可以用and或者or关键字,但是linq中不支持,那么应该如图连接,创建匿名对象包含连接关键字来作为连接条件
在这里插入图片描述

二、Linq To Xml

在这里插入图片描述
读取
在这里插入图片描述

三、本文代码

LinqShow.cs

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值