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
相关产品推荐
相关产品推荐

