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

C#字典新增键值对或递增已有值的最优实现方式

字符出现次数统计:三种方案分析与最优实现

需求场景:使用Dictionary<char, int>类型的myDict,遍历字符串word(示例:"aaabbc")统计每个字母的出现次数。规则是:遇到新字母时添加键值对,初始值设为1;若字母已存在则将对应值递增1。

下面逐一分析你给出的三种方案:

选项1:基础常规实现

foreach(char ltr in word){
    if (myDict.ContainsKey(ltr)) {
        myDict[ltr] +=1;
    } else {
        myDict[ltr] = 1;
    }
}

这是正确且标准的基础写法,逻辑清晰易懂,没有多余的性能开销。唯一的小细节是:ContainsKey和myDict[ltr]会对字典进行两次查找操作(第一次检查存在性,第二次取值/赋值),不过对于大多数业务场景来说,这个性能差异可以忽略。

选项2:异常处理实现(强烈不推荐)

foreach(char ltr in word){
    try {
       myDict.Add(ltr, 1);
    } catch(Exception){
       myDict[ltr] += 1;
    }
}

这种写法完全不可取,核心问题有两个:

  1. 性能极差:异常处理的系统开销极大,当字符串中有大量重复字符时,每次重复都会触发异常捕获,会导致程序运行效率暴跌。
  2. 语义错误:异常应该用来处理意外的错误情况,而非作为常规的业务逻辑分支判断,代码可读性也极差。

选项3:冗余变量的三元表达式实现

foreach(char ltr in word){
    int dummy = myDict.ContainsKey(ltr) ? myDict[ltr] += 1 : myDict[ltr] = 1;
}

这种写法虽然简洁,但存在明显的冗余问题:dummy变量完全没有实际用途,只是为了满足三元表达式需要赋值给变量的语法要求。这会让后续维护代码的人产生困惑,可读性不如选项1,不推荐使用。


更优的实现方案

推荐使用Dictionary.TryGetValue方法,它可以在一次操作中完成键存在性检查和取值,避免了选项1中的两次字典查找,性能更优,逻辑同样清晰:

foreach(char ltr in word)
{
    if (myDict.TryGetValue(ltr, out int count))
    {
        myDict[ltr] = count + 1;
    }
    else
    {
        myDict[ltr] = 1;
    }
}

如果只是单纯统计字符出现次数,不需要逐步构建字典的额外逻辑,还可以用LINQ一行代码搞定,简洁高效:

var myDict = word.GroupBy(c => c).ToDictionary(g => g.Key, g => g.Count());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:42:40