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

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

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

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

一、数据准备

    跟上篇文章一样首先新建一个客户类,并模拟填充一些数据,用来做数据准备,对于不能使用的,将新建数组测试。字段有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,如下图,这具体有啥用呢?

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

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);

输出结果如下:

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

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。本公众号宗旨是干货,所以今天全罗列出来了,仅供大家参考。