1. 程式人生 > 其它 >.NET 6 中 LINQ 的改進

.NET 6 中 LINQ 的改進

1.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

2.新的 By 方法

  • 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; } }

 

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

 4.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