😺

.NET 9の新しいLINQのCountBy

2024/09/16に公開

.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