You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中是否存在类似Python Counter类的.NET内置对象?

C# 实现类似 Python Counter 的元素计数

我熟悉Python的Counter类,现在在C#场景下需要统计字符串列表中元素的出现次数,目前使用的代码如下:

foreach( var item in dict_of_dates.Values)
{
    foreach(var item2 in item)
    {
        if (item2 == set_1.ElementAt(0))
            count++;
        else if (item2 == set_1.ElementAt(1))
            count_1++;
        else if (item2 == set_1.ElementAt(2))
            count_2++;
        else if (item2 == set_1.ElementAt(3))
            count_3++;
        else if (item2 == set_1.ElementAt(4))
            count_4++;
        else if (!set_1.Contains(item2))
            count_5++;
    }
}

这段代码存在明显问题:当集合set_1的元素数量不确定时,必须不断新增if-else分支和计数变量,导致代码极度臃肿。我想了解C#是否有可结合Lambda和HashSet使用的内置计数类,还是需要自行实现?最终希望得到类似{"a": 20, "b": 30, "c": 40}格式的键值对集合,方便遍历用于绘图。

解决方案

C#无需自行实现这类计数逻辑,利用LINQ的链式查询就能轻松达成类似Python Counter的效果,代码如下:

var countDict = dict_of_dates.Values
    .SelectMany(x => x)
    .GroupBy(s => s)
    .ToDictionary(g => g.Key, g => g.Count());

foreach(var item in countDict)
{
    Console.WriteLine(item.Key);
    Console.WriteLine(item.Value);
}

代码逻辑说明

  • SelectMany(x => x):将dict_of_dates.Values中的嵌套集合扁平化为单个元素序列
  • GroupBy(s => s):以元素值为分组依据,将相同元素归为一组
  • ToDictionary(g => g.Key, g => g.Count()):将分组结果转换为字典,键为元素值,值为该元素的出现次数

内容的提问来源于stack exchange,提问作者Wandering

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:13:21