网站首页 > 博客文章 正文
原文:bit.ly/32guqbn
作者:Oleg Kyrylchuk
翻译:精致码农-王亮
*OrDefault 方法的默认值
Enumerable.FirstOrDefault 方法返回一个序列的第一个元素,如果没有找到,则返回一个默认值。在 .NET 6 中,你可以覆盖该方法的默认值。同样,你还可以覆盖 SingleOrDefault 和 LastOrDefault 方法的默认值。
List<int> list1 = new() { 1, 2, 3 };
int item1 = list1.FirstOrDefault(i => i == 4, -1);
Console.WriteLine(item1); // -1
List<string> list2 = new() { "Item1" };
string item2 = list2.SingleOrDefault(i => i == "Item2", "Not found");
Console.WriteLine(item2); // Not found
新的 *By 方法
.NET 6 引入了新的 Enumerable.By* 方法,它的 keySelector 参数用来比较元素。这些新方法有:
- MinBy
- MaxBy
- DistinctBy
- ExceptBy
- IntersectBy
- UnionBy
List<Product> products = new()
{
new() { Name = "Product1", Price = 100 },
new() { Name = "Product2", Price = 5 },
new() { Name = "Product3", Price = 50 },
};
Product theCheapestProduct = products.MinBy(x => x.Price);
Product theMostExpensiveProduct = products.MaxBy(x => x.Price);
Console.WriteLine(theCheapestProduct);
// Output: Product { Name = Product2, Price = 5 }
Console.WriteLine(theMostExpensiveProduct);
// Output: Product { Name = Product1, Price = 100 }
record Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
新的 Chunk 方法
如果你需要将一个序列的元素分割成块,在 .NET 6 中你不必再自己实现了,它引入了一个新的 Enumerable.Chunk 扩展方法。
IEnumerable<int> numbers = Enumerable.Range(1, 505);
IEnumerable<int[]> chunks = numbers.Chunk(100);
foreach (int[] chunk in chunks)
{
Console.WriteLine(#34;{chunk.First()}...{chunk.Last()}");
}
// Output:
// 1...100
// 101...200
// 201...300
// 301...400
// 401...500
// 501...505
三向 Zip 方法
Enumerable.Zip 扩展方法可以将两个序列进行结合产生产生一个二元组序列。在 .NET 6 中,它可以结合三个序列产生一个三元组序列。
int[] numbers = { 1, 2, 3, 4, };
string[] months = { "Jan", "Feb", "Mar" };
string[] seasons = { "Winter", "Winter", "Spring" };
var test = numbers.Zip(months).Zip(seasons);
foreach ((int, string, string) zipped in numbers.Zip(months, seasons))
{
Console.WriteLine(#34;{zipped.Item1} {zipped.Item2} {zipped.Item3}");
}
// Output:
// 1 Jan Winter
// 2 Feb Winter
// 3 Mar Spring
ElementAt 方法支持 Index
.NET Core 3.0 引入了 Index 结构体,它被 C# 编译器用来支持一个新的前缀“帽子”运算符(^)。它表示“从集合的末端”开始的索引。在 .NET 6 中,Enumerable.ElementAt 方法支持 Index。
IEnumerable<int> numbers = new int[] { 1, 2, 3, 4, 5 };
int last = numbers.ElementAt(^0);
Console.WriteLine(last); // 5
Take 方法支持Range
.NET Core 3.0 中也引入了 Range 结构体,它被 C# 编译器用来支持一个范围操作符 ...。在 .NET 6 中,Enumerable.Take 方法也支持 Range。
IEnumerable<int> numbers = new int[] { 1, 2, 3, 4, 5 };
IEnumerable<int> taken1 = numbers.Take(2..4);
foreach (int i in taken1)
Console.WriteLine(i);
// Output:
// 3
// 4
IEnumerable<int> taken2 = numbers.Take(..3);
foreach (int i in taken2)
Console.WriteLine(i);
// Output:
// 1
// 2
// 3
IEnumerable<int> taken3 = numbers.Take(3..);
foreach (int i in taken3)
Console.WriteLine(i);
// Output:
// 4
// 5
用 TryGetNonEnumeratedCount 避免列举
.NET 6 引入了一个新的 Enumerable.TryGetNonEnumerated 方法,它试图确定一个序列中元素的数量,而不强制进行列举。它对 IQueryable 很有用,当调用 Enumerable.Count 时,你不希望执行整个查询。
IEnumerable<int> numbers = GetNumbers();
TryGetNonEnumeratedCount(numbers);
// Output: Could not get a count of numbers without enumerating the sequence
IEnumerable<int> enumeratedNumbers = numbers.ToList();
var test = enumeratedNumbers.ElementAt(-1);
TryGetNonEnumeratedCount(enumeratedNumbers);
// Output: Count: 5
void TryGetNonEnumeratedCount(IEnumerable<int> numbers)
{
if (numbers.TryGetNonEnumeratedCount(out int count))
Console.WriteLine(#34;Count: {count}");
else
Console.WriteLine("Could not get a count of numbers without enumerating the sequence");
}
IEnumerable<int> GetNumbers()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
}
结束语
所有的代码示例你都可以在我的 GitHub 上找到:
https://github.com/okyrylchuk/dotnet6_features/tree/main/LINQ%20imrpovements
猜你喜欢
- 2024-10-15 Python 速度慢,试试这个方法提高 1000 倍
- 2024-10-15 C# 文件操作浅析(c#代码文件)
- 2024-10-15 从零开始自学C#基础的第十五天——数组的基本用法
- 2024-10-15 浅谈C#取消令牌CancellationTokenSource
- 2024-10-15 总结了才知道,原来channel有这么多用法
- 2024-10-15 面向对象(8-15)异常类-C#编程零基础到入门学习
- 2024-10-15 Log4net配置文件 C#(c# log4j)
- 2024-10-15 C# BIN文件读取以及CRC校验(匹配STM32F103)
- 2024-10-15 C#如何对String中的Contact/Join方法进行优化的
- 2024-10-15 .NET 中的值对象(DDD 基础知识)(.net的数据类型)
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)