在C# WinForms中如何用Dictionary和.Max显示多个众数?
获取数组中所有众数的实现方案
问题背景
有一个最大长度为24的已排序数组,元素是1-100的随机数,示例数组如下:
2 8 9 10 13 19 20 38 43 47 51 55 55 59 66 67 73 84 87 87 93 95 98 100
其中55和87均出现2次,是出现次数最多的众数。当前使用Dictionary统计元素出现次数的代码仅能返回出现次数最多的最小数值(如示例中的55),需要修改代码以显示所有众数。
原代码
private void buttonMode_Click(object sender, EventArgs e) { int mode = 0; int max = 0; var counts = new Dictionary<int, int>(); foreach (int value in dataArray) { if (counts.ContainsKey(value)) { counts[value]++; } else { counts.Add(value, 1); } } foreach(KeyValuePair<int,int> count in counts) { if (count.Value > max) { mode = count.Key; max = count.Value; } } textBoxOut1.Text = $"Mode is: {mode}"; }
修改后的实现
要获取所有众数,只需两步:先找到最大出现次数,再筛选出所有出现次数等于该值的元素。结合LINQ的Max方法可以快速实现,修改后的代码如下:
private void buttonMode_Click(object sender, EventArgs e) { // 统计每个元素的出现次数 var counts = new Dictionary<int, int>(); foreach (int value in dataArray) { if (counts.ContainsKey(value)) { counts[value]++; } else { counts.Add(value, 1); } } // 获取最大出现次数 int maxOccurrence = counts.Values.Max(); // 筛选出所有出现次数等于最大值的元素(即所有众数) var allModes = counts.Where(kv => kv.Value == maxOccurrence) .Select(kv => kv.Key) .ToList(); // 根据众数数量格式化输出文本 if (allModes.Count == 1) { textBoxOut1.Text = $"Mode is: {allModes[0]}"; } else { textBoxOut1.Text = $"Modes are: {string.Join(", ", allModes)}"; } }
简化统计逻辑(可选)
如果使用LINQ的GroupBy,可以更简洁地完成元素次数统计,替代原有的foreach循环:
// 替代原有的foreach统计逻辑 var counts = dataArray.GroupBy(num => num) .ToDictionary(group => group.Key, group => group.Count());
代码说明
counts.Values.Max():从字典的所有值(即元素出现次数)中获取最大值,这是众数的出现次数标准。Where(kv => kv.Value == maxOccurrence):筛选出字典中所有出现次数等于最大值的键值对。Select(kv => kv.Key):提取这些键值对的键,得到所有众数的集合。- 最后根据众数的数量,输出对应的文本格式,保证单个或多个众数都能正确显示。
内容的提问来源于stack exchange,提问作者Gilli
相关产品推荐
相关产品推荐

