如何使用 Dictionary<int, int> 来统计数组 nums 中每个数字的出现次数

代码解释

csharp复制
IDictionary<int, int> counts = new Dictionary<int, int>(); // 创建一个字典来存储每个数字的出现次数
foreach (int num in nums) // 遍历数组 nums
{
    counts.TryAdd(num, 0); // 尝试将 num 添加到字典中,初始值为 0
    counts[num]++; // 将 num 的计数加 1
}

关键点

  1. TryAdd 方法:
    • TryAdd 是 C# 8.0 引入的方法,用于尝试将键值对添加到字典中。
    • 如果键已经存在,TryAdd 不会覆盖原有值,也不会抛出异常,而是直接返回 false
    • 这使得 TryAdd 非常适合在统计场景中使用,避免了重复键的处理问题。
  2. counts[num]++
    • 如果键已经存在,counts[num] 会直接访问该键对应的值并将其加 1。
    • 如果键不存在,TryAdd 确保了键已经被初始化为 0,因此可以直接进行加 1 操作。

优化建议

虽然你的代码已经很清晰,但可以进一步优化以减少重复操作。例如,可以使用 GetOrAdd 方法(如果使用 ConcurrentDictionary)或者直接检查键是否存在。

优化版本 1:使用 ContainsKey

如果你使用的是普通 Dictionary,可以结合 ContainsKey 方法来优化代码:
csharp复制
Dictionary<int, int> counts = new Dictionary<int, int>();
foreach (int num in nums)
{
    if (!counts.ContainsKey(num))
    {
        counts[num] = 0; // 如果键不存在,初始化为 0
    }
    counts[num]++; // 增加计数
}

优化版本 2:使用 ConcurrentDictionary 的 GetOrAdd

如果你需要线程安全的字典操作,可以使用 ConcurrentDictionaryGetOrAdd 方法:
csharp复制
using System.Collections.Concurrent;

ConcurrentDictionary<int, int> counts = new ConcurrentDictionary<int, int>();
foreach (int num in nums)
{
    counts.AddOrUpdate(num, 1, (key, oldValue) => oldValue + 1);
}
  • AddOrUpdate 方法会检查键是否存在:
    • 如果不存在,初始化为 1。
    • 如果存在,将旧值加 1。

完整示例

以下是一个完整的示例,展示如何统计数组中每个数字的出现次数,并计算好数对的数量:
csharp复制
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int[] nums = { 1, 2, 3, 2, 1, 3, 1, 1, 2 };
        Dictionary<int, int> counts = new Dictionary<int, int>();

        // 统计每个数字的出现次数
        foreach (int num in nums)
        {
            if (!counts.ContainsKey(num))
            {
                counts[num] = 0; // 如果键不存在,初始化为 0
            }
            counts[num]++; // 增加计数
        }

        // 计算好数对的数量
        long goodPairs = 0;
        foreach (var count in counts.Values)
        {
            goodPairs += (long)count * (count - 1) / 2;
        }

        Console.WriteLine($"Number of good pairs: {goodPairs}");
    }
}

输出

对于输入数组 { 1, 2, 3, 2, 1, 3, 1, 1, 2 },输出将是:
Number of good pairs: 10

总结

你的代码已经很好地实现了统计数组中每个数字的出现次数。通过使用 TryAdd,代码更加简洁且避免了异常。如果需要进一步优化,可以考虑使用 ContainsKeyConcurrentDictionaryAddOrUpdate 方法。
posted @   yinghualeihenmei  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-02-17 针对此日期格式的各种转换:'2022-01-31 15:06:23'
2023-02-17 正由另一进程使用,因此该进程无法访问该文件-----解决办法总结
2023-02-17 map数据类型,与object 类型的区别
2023-02-17 String之contains方法
点击右上角即可分享
微信分享提示