Linq 新功能 (1) MaxBy与MinBy

趁着最近空闲,来整理一下从 .NET 6 之后 Linq 上的新功能。

本集提要
  • 框架 : .NET 6
  • 功能 : MaxBy, MinBy
说明

Linq 的 Max与Min 方法可以协助我们取得一串执行个体中某个属性的最大值或最小值,当我们想要取得的是具有最大值或最小值的执行个体就得要拐弯。

例如有以下序列:

 var people = new List<Person>
 {
     new Person { Name = "Alice", Age = 30 },
     new Person { Name = "Bob", Age = 25 },
     new Person { Name = "Charlie", Age = 35 }
 };

如果要取得最大的年龄,通常我们会这么写:

int maxAge = people.Max(p => p.Age);

但需求如果是要取得具有最大年龄的那个执行个体,可能会有一些其他做法,例如 (先不考虑强固性的问题):

(1) 先 OrderByDescending 再 First

Person oldestPerson1 = people.OrderByDescending(p => p.Age).First();

(2) 先取 Max 再 First

int maxAge = people.Max(p => p.Age);
Person oldestPerson2 = people.First(p => p.Age == maxAge);

老实说也没真的很难啦。不过微软在 .NET 6 提供了更方便的方法,MaxBy 与 MinBy:

 Person oldestPerson3 = people.MaxBy(p => p.Age);
 Person youngestPerson3 = people.MinBy(p => p.Age);

上述的範例在此。

Benchmark

我也好奇测试了一下效能,MaxBy 和 MinBy 似乎比旧式的方式要快一些,而且使用更少的记忆体,可以在这边看到 Benchmark 测试的程式码。

两次记录的结果如下:

// * Summary *

BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4751/23H2/2023Update/SunValley3)
12th Gen Intel Core i7-1265U, 1 CPU, 12 logical and 10 physical cores
.NET SDK 9.0.200-preview.0.24575.35
  [Host]     : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2
  DefaultJob : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2


| Method                   | Mean     | Error     | StdDev    | Gen0   | Allocated |
|------------------------- |---------:|----------:|----------:|-------:|----------:|
| CallOrderByDescThenFirst | 4.348 us | 0.0579 us | 0.0542 us | 0.0153 |     128 B |
| CallMaxThenFirst         | 4.446 us | 0.0699 us | 0.0653 us | 0.1144 |     760 B |
| CallMaxBy                | 3.727 us | 0.0327 us | 0.0306 us | 0.0038 |      40 B |
| CallOrderByThenFirst     | 4.913 us | 0.0583 us | 0.0545 us | 0.0153 |     128 B |
| CallMinThenFirst         | 3.870 us | 0.0435 us | 0.0407 us | 0.0381 |     280 B |
| CallMinBy                | 3.654 us | 0.0565 us | 0.0501 us | 0.0038 |      40 B |


// * Summary *

BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4751/23H2/2023Update/SunValley3)
12th Gen Intel Core i7-1265U, 1 CPU, 12 logical and 10 physical cores
.NET SDK 9.0.200-preview.0.24575.35
  [Host]     : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2
  DefaultJob : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2


| Method                   | Mean     | Error     | StdDev    | Gen0   | Allocated |
|------------------------- |---------:|----------:|----------:|-------:|----------:|
| CallOrderByDescThenFirst | 4.406 us | 0.0863 us | 0.0848 us | 0.0153 |     128 B |
| CallMaxThenFirst         | 4.511 us | 0.0591 us | 0.0553 us | 0.1068 |     712 B |
| CallMaxBy                | 3.659 us | 0.0350 us | 0.0292 us | 0.0038 |      40 B |
| CallOrderByThenFirst     | 4.730 us | 0.0684 us | 0.0640 us | 0.0153 |     128 B |
| CallMinThenFirst         | 3.944 us | 0.0670 us | 0.0627 us | 0.0763 |     520 B |
| CallMinBy                | 3.633 us | 0.0588 us | 0.0550 us | 0.0038 |      40 B |

 

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章

5 点赞(415) 阅读(67)