CodeSnippet.Cn
代码片段
Csharp
架构设计
.NetCore
西班牙语
kubernetes
MySql
Redis
Algorithm
Ubuntu
Linux
Other
.NetMvc
VisualStudio
Git
pm
Python
WPF
java
Plug-In
分布式
CSS
微服务架构
JavaScript
DataStructure
Shared
.NET 6 中 LINQ 的改进
0
Csharp
小笨蛋
发布于:2022年01月26日
更新于:2022年01月26日
127
#custom-toc-container
### *OrDefault 方法的默认值 `Enumerable.FirstOrDefault` 方法返回一个序列的第一个元素,如果没有找到,则返回一个默认值。在 .NET 6 中,你可以覆盖该方法的默认值。同样,你还可以覆盖 `SingleOrDefault` 和 `LastOrDefault` 方法的默认值。 ```csharp List
list1 = new() { 1, 2, 3 }; int item1 = list1.FirstOrDefault(i => i == 4, -1); Console.WriteLine(item1); // -1 List
list2 = new() { "Item1" }; string item2 = list2.SingleOrDefault(i => i == "Item2", "Not found"); Console.WriteLine(item2); // Not found Www.CodeSnippet.cn ``` ### 新的 *By 方法 .NET 6 引入了新的 `Enumerable.By*` 方法,它的 `keySelector` 参数用来比较元素。这些新方法有: - MinBy - MaxBy - DistinctBy - ExceptBy - IntersectBy - UnionBy ```csharp List
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` 扩展方法。 ```csharp IEnumerable
numbers = Enumerable.Range(1, 505); IEnumerable
chunks = numbers.Chunk(100); foreach (int[] chunk in chunks) { Console.WriteLine($"{chunk.First()}...{chunk.Last()}"); } // Output: // 1...100 // 101...200 // 201...300 // 301...400 // 401...500 // 501...505 ``` ### 三向 Zip 方法 `Enumerable.Zip` 扩展方法可以将两个序列进行结合产生产生一个二元组序列。在 .NET 6 中,它可以结合三个序列产生一个三元组序列。 ```csharp 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($"{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`。 ```csharp IEnumerable
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`。 ```csharp IEnumerable
numbers = new int[] { 1, 2, 3, 4, 5 }; IEnumerable
taken1 = numbers.Take(2..4); foreach (int i in taken1) Console.WriteLine(i); // Output: // 3 // 4 IEnumerable
taken2 = numbers.Take(..3); foreach (int i in taken2) Console.WriteLine(i); // Output: // 1 // 2 // 3 IEnumerable
taken3 = numbers.Take(3..); foreach (int i in taken3) Console.WriteLine(i); // Output: // 4 // 5 ``` ### 用 TryGetNonEnumeratedCount 避免列举 .NET 6 引入了一个新的 `Enumerable.TryGetNonEnumerated` 方法,它试图确定一个序列中元素的数量,而不强制进行列举。它对 `IQueryable` 很有用,当调用 `Enumerable.Count` 时,你不希望执行整个查询。 ```csharp IEnumerable
numbers = GetNumbers(); TryGetNonEnumeratedCount(numbers); // Output: Could not get a count of numbers without enumerating the sequence IEnumerable
enumeratedNumbers = numbers.ToList(); var test = enumeratedNumbers.ElementAt(-1); TryGetNonEnumeratedCount(enumeratedNumbers); // Output: Count: 5 void TryGetNonEnumeratedCount(IEnumerable
numbers) { if (numbers.TryGetNonEnumeratedCount(out int count)) Console.WriteLine($"Count: {count}"); else Console.WriteLine("Could not get a count of numbers without enumerating the sequence"); } IEnumerable
GetNumbers() { yield return 1; yield return 2; yield return 3; yield return 4; yield return 5; } ```
这里⇓感觉得写点什么,要不显得有点空,但还没想好写什么...
返回顶部
About
京ICP备13038605号
© 代码片段 2024