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

在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());

代码说明

  1. counts.Values.Max():从字典的所有值(即元素出现次数)中获取最大值,这是众数的出现次数标准。
  2. Where(kv => kv.Value == maxOccurrence):筛选出字典中所有出现次数等于最大值的键值对。
  3. Select(kv => kv.Key):提取这些键值对的键,得到所有众数的集合。
  4. 最后根据众数的数量,输出对应的文本格式,保证单个或多个众数都能正确显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:26:00