使用 .Net/C# 计算集合的频率分布

Posted

技术标签:

【中文标题】使用 .Net/C# 计算集合的频率分布【英文标题】:Calculating frequency distribution of a collection with .Net/C# 【发布时间】:2010-12-08 13:40:46 【问题描述】:

有没有一种快速/简单的方法来使用 Linq 或其他方式计算 .Net 集合的频率分布?

例如:一个任意长的 List 包含许多重复。遍历列表和计数/跟踪重复的聪明方法是什么?

【问题讨论】:

【参考方案1】:

在列表中查找重复项的最简单方法是将其分组,如下所示:

var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());

(Writing Skip(1).Any() 应该比 (Count() > 1) 快,因为它不必从每个组中遍历两个以上的项目。但是,除非list 的枚举器是,否则差异可能可以忽略不计慢)

【讨论】:

【参考方案2】:

最简单的方法是使用哈希图,或者使用值作为键并递增值,或者选择一个桶大小(桶 1 = 1 - 10,桶 2 = 11 - 20 等),然后递增每个按值存储桶。

然后你可以通过并确定频率。

【讨论】:

【参考方案3】:

C5 generic collections library 有一个 HashBag 实现,它通过计数来接受重复项。以下伪代码将为您提供所需的内容:

var hash = new HashBag(); hash.AddAll(list); var mults = hash.ItemMultiplicities();

(其中K 是列表中项目的类型)mults 将包含IDictionary<K,int>,其中列表项目是键,多重性是值。

【讨论】:

我没有使用 C5,但最终基于类似的想法编写了自己的流程:Dictionary

以上是关于使用 .Net/C# 计算集合的频率分布的主要内容,如果未能解决你的问题,请参考以下文章

频率分布直方图,的概念与应用?

技巧(7)——频率分布直方图

请问怎么做频率分布直方图啊

频率分布的中位数

17、频率模型-泊松分布

Python - 如何计算标准化频率的标准偏差