如何使用 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
}
关键点
-
TryAdd
方法:-
TryAdd
是 C# 8.0 引入的方法,用于尝试将键值对添加到字典中。 -
如果键已经存在,
TryAdd
不会覆盖原有值,也不会抛出异常,而是直接返回false
。 -
这使得
TryAdd
非常适合在统计场景中使用,避免了重复键的处理问题。
-
-
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
如果你需要线程安全的字典操作,可以使用
ConcurrentDictionary
的 GetOrAdd
方法: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
,代码更加简洁且避免了异常。如果需要进一步优化,可以考虑使用 ContainsKey
或 ConcurrentDictionary
的 AddOrUpdate
方法。
· 分享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方法