ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[译]. NET 6 中的 LINQ 改进

2022-01-17 09:33:27  阅读:186  来源: 互联网

标签:Console int IEnumerable LINQ 改进 numbers WriteLine NET


介绍

接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。

源作者链接:https://blog.okyrylchuk.dev/linq-improvements-in-net-6

正文

*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

新的*排序方法

.NET 6 引入了新的Enumerable。通过*排序方法。提供了一个“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; }
}

一种新的分块方法

如果您需要将序列的元素拆分为块,则不必再在 .NET 6 中自行实现它。它引入了新的Enumerable.Chunk扩展方法。

IEnumerable<int> numbers = Enumerable.Range(1, 505);
IEnumerable<int[]> 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

三向拉链法

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($"{zipped.Item1} {zipped.Item2} {zipped.Item3}");
}
// Output:
// 1 Jan Winter
// 2 Feb Winter
// 3 Mar Spring

ElementAt 方法中的索引支持

.NET Core 3.0 引入了Index结构,C# 编译器使用它来支持新的一元前缀“hat”运算符 (^)。这意味着索引“从集合的末尾”。在 .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 中引入。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方法。让我们可以计算可枚举类型元素的总数。

TryGetNonEnumeratedCount方法,表示如果可以快速计数,该方法将返回true并将计数作为out变量返回。

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($"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;
}

结语

联系作者:加群:867095512 @MrChuJiu

公众号

标签:Console,int,IEnumerable,LINQ,改进,numbers,WriteLine,NET
来源: https://www.cnblogs.com/MrChuJiu/p/15812197.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有