😺
.NET 9の新しいLINQのCountBy
.NET 9でCountByとAggregeteByのあたらいLINQが導入されました。
今回はこのうちCountByについての解説です。
機能
CountByを使用することによって書くキーの頻度を素早く計算できます。
これまではGroupByを使ってグルーピングしてからキーごとのCountを取ってということをしていたものがCountByを使用することによって簡単かつ素早く実装できます。
実装例
以前
private readonly int[] randomDiceNumbers = [1, 2, 2, 4, 2, 6, 1, 5, 3, 2, 1, 3, 4, 5, 6, 3, 1, 1, 3, 4, 2, 6, 5, 4, 1, 3, 4, 1, 3, 6, 4, 2, 1];
var res = randomDiceNumbers.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).ToList();
Count Byを用いた実装
private readonly int[] randomDiceNumbers = [1, 2, 2, 4, 2, 6, 1, 5, 3, 2, 1, 3, 4, 5, 6, 3, 1, 1, 3, 4, 2, 6, 5, 4, 1, 3, 4, 1, 3, 6, 4, 2, 1];
var res = randomDiceNumbers.CountBy(x => x).ToList();
速度比較
速度面でもCountByの方が優位である
[ShortRunJob]
public class LinqCountBy
{
private readonly int[] randomDiceNumbers = [1, 2, 2, 4, 2, 6, 1, 5, 3, 2, 1, 3, 4, 5, 6, 3, 1, 1, 3, 4, 2, 6, 5, 4, 1, 3, 4, 1, 3, 6, 4, 2, 1];
[Benchmark]
public void WithCountBy()
{
var res = randomDiceNumbers.CountBy(x => x).ToList();
}
[Benchmark]
public void WithGroupBy()
{
var res = randomDiceNumbers.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count()).ToList();
}
}
Method | Mean | Error | StdDev |
---|---|---|---|
WithCountBy | 357.4 ns | 252.52 ns | 13.84 ns |
WithGroupBy | 759.5 ns | 17.46 ns | 0.96 ns |
Discussion