精:.NET6 Linq的新特性使用案例全在这里

    前面一篇文章介绍了.NET6 Linq新特性MaxBy 和 MinBy,知识点比较单一,.NET6 Linq的新特征有9类,比如DistinctBy、ExceptBy、IntersectBy等,都非常的实用。本文就总结一下.NET6 Linq的所有新特性,并通过案例实践。具体特性简介如下表。

序号特性简介
1DistinctBy 根据指定的键选择器从集合返回不同元素的集合
2ExceptBy 根据指定的键选择器生成两个集合的集合差集
3IntersectBy 根据指定的键选择器函数生成两个集合的集合交集
4UnionBy 根据指定的键选择器生成两个集合的集合并集
5MinBy 根据指定的键选择器函数返回集合中的最小值
6MaxBy 根据指定的键选择器函数返回集合中的最大值
7TryGetNonEnumeratedCount 尝试在不强制枚举的情况下确定序列中的元素数。
8Chunk将序列的元素拆分为指定大小的区块
9ElementAt返回元素指定索引或者结束的索引
10LastOrDefault返回序列中的最后一个元素;如果未找到该元素,则返回默认值
11SingleOrDefault 返回序列中的唯一元素;如果该序列为空,则返回默认值;如果该序列包含多个元素,此方法将引发异常。
12Take接受 Range 参数从序列的开头返回指定数量的相邻元素,支持Range 参数
13Zip将指定函数应用于两个序列的对应元素,以生成结果序列

接下来我们介绍它们的使用。

一、数据准备

    跟上篇文章一样首先新建一个客户类,并模拟填充一些数据,用来做数据准备,对于不能使用的,将新建数组测试。字段有id,name,email,age如下代码。

public class Customer //客户类
    {
        public int id { get; set; }
        public string name { get; set; }
        public string email { get; set; }
        public int age { get; set; }
    }
    //模拟数据
    public static List<Customer> GetCustomer()
        {
            List<Customer> list = new List<Customer>();
            list.Add(new Customer { id = 1, name = "刘德华", age = 56, email = "ldh@net.cn" });
            list.Add(new Customer { id = 2, name = "张学友", age = 52, email = "zxy@net.cn" });
            list.Add(new Customer { id = 3, name = "黎明", age = 58, email = "lm@net.cn" });
            list.Add(new Customer { id = 4, name = "郭富城", age = 60, email = "gfc@net.cn" });
            list.Add(new Customer { id = 5, name = "古天乐", age = 60, email = "gfc@net.cn" });
            return list;
       }

二、使用案例

1、DistinctBy

这个比较简单,解决了之前排序需要一堆代码的问题,具体使用如下:

var rel = GetCustomer().DistinctBy(d=>new { d.age,d.email });
 //按age,email排除重复,结果返回4条元素,因为ID为4、5的元素age,email重复

2、TryGetNonEnumeratedCount 

尝试在不强制枚举的情况下确定序列中的元素数。

int num=0;
GetCustomer().TryGetNonEnumeratedCount(out num);
Console.WriteLine(num);//输出5,如果没有元素将是0,有点像TryParse

3、Chunk

将序列的元素拆分为指定大小的区块

var rel2 = GetCustomer().Chunk(2).ToList();
var rel3= rel2.ToList();
//rel3结果有3个集合,前两个集合为2,最后一个是1,如下图,这具体有啥用呢?

53e59ce47c96a860ba585361ed1ce50a.png

4、ElementAt

返回元素指定索引或者结束的索引

var a = GetCustomer().ElementAt(2);
var b = GetCustomer().ElementAt(^2);
//a返回ID为3的对象,b返回倒数第二个对象Id为4

5、Take接受 Range 参数

从序列的开头返回指定数量的相邻元素,接受 Range 参数以简化序列切片的创建

var rel5 = GetCustomer().Take(1..3).ToList();
//相当于GetCustomer().Take(3).Skip(1).ToList();//返回两条数据

6、Zip

将指定函数应用于两个序列的对应元素,以生成结果序列

string[] order = { "a","b" , "c", "d" };
string[] words = { "one", "two", "three" };
var numbersAndWords = order.Zip(words, (a, b) => a + " " + b);
foreach (var item in numbersAndWords)
                Console.WriteLine(item);

输出结果如下:

34d7b267ad14372f6b5514783e12eb9c.png

7、ExceptBy

根据指定的键选择器生成两个集合的集合差集

int[] nums1 = { 1, 3, 8, 9, 3 };
 int[] nums2 = { 1, 3, 4, 9, 6,7,5 };
 var rel6 = nums1.ExceptBy(nums2,a=>a);
 //输出结果为8,以第一个集合为主

IntersectBy,UnionBy  这两个与ExceptBy大同小异,这里就不举例说明了,大家可以亲自尝试一下。

8、MaxBy 和 MinBy

这两个上一篇文章已经讲过请点击:NET6 Linq新特性MaxBy 和 MinBy

9、LastOrDefault、SingleOrDefault 

这两个的使用也不做案例,跟FirstOrDefault类似。

结语

    本文补充完了前面一篇文章的linq新特征,有几个特征有些异同了,大家自己可以尝试一下。.NET6 Linq新的特征虽然没有根本性的变化,但是新增的部分功能也不错,比如DistinctBy。本公众号宗旨是干货,所以今天全罗列出来了,仅供大家参考。

参考:微软官方文档

版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。

技术群:添加小编微信并备注进群
小编微信:mm1552923   公众号:dotNet编程大全
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值