前面一篇文章介绍了.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,如下图,这具体有啥用呢?
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);
输出结果如下:
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编程大全