C# Dictionary键值对集合使用实例

远山来客
远山来客
发布时间:2026-10-13| 5人浏览过
原创

在C#开发中,Dictionary类是管理键值对(Key-Value)集合的核心工具,其最大优势在于能够根据键(Key)极速定位并检索对应的值(Value)。本文将通过分析成绩管理系统的示例代码,深入讲解如何利用Add、ContainsKey和TryGetValue等方法处理基础数据增删查改,并结合Keys属性完成批量数据的统计计算。

实例应用:班级成绩统计系统

本示例模拟了一个多层级的数据处理场景:将不同班级的多名学生成绩存入字典集合中,随后逐班提取数据并进行分数汇总。在此过程中涉及两个自定义类:ScoreReport用于记录单个学生的语文、数学和英语成绩;ScoreStatistics则用于承载班级的总分与平均分统计数据。

第一步:定义并初始化字典对象

程序首先创建了两个核心的 Dictionary 实例。第一个字典名为 scoreDictionary,其泛型结构为 Dictionary<int, List<ScoreReport>>,以班级编号作为主键,每个键对应一个保存了本班所有学生详细成绩的列表。第二个字典名为 scoreStatisticsDictionary,类型为 Dictionary<int, ScoreStatistics>,用于存储各班最终的计算结果。

在初始化阶段,依次调用 Add 方法向 scoreDictionary 中添加三个班级的具体学生数据。与此同时,为 scoreStatisticsDictionary 中的这三个班级预分配了空的 ScoreStatistics 对象,以便后续写入实时统计结果。

using System;
using System.Collections.Generic;
using System.Linq;

namespace DictionaryExp
{
  class Program
  {
    static void Main(string[] args)
    {
      // 1. 初始化主字典:用于存放所有班级的详细成绩单
      Dictionary<int, List<ScoreReport>> scoreDictionary = new Dictionary<int, List<ScoreReport>>();
      
      // 2. 使用 Add 方法填入1班成绩数据
      scoreDictionary.Add(1,
        new List<ScoreReport>()
        {
          new ScoreReport(){Name="三五月儿",ChineseScore=100,MathScore=100,EnglishScore=100},
          new ScoreReport(){Name="张三",ChineseScore=80,MathScore=78,EnglishScore=91},
          new ScoreReport(){Name="李四",ChineseScore=90,MathScore=87,EnglishScore=88}
        });
        
      // 同理填充2班、3班的数据...

      // 3. 初始化统计表字典,并预置空的对象占位
      Dictionary<int, ScoreStatistics> scoreStatisticsDictionary = new Dictionary<int, ScoreStatistics>();
      scoreStatisticsDictionary.Add(1, new ScoreStatistics());
      scoreStatisticsDictionary.Add(2, new ScoreStatistics());
      scoreStatisticsDictionary.Add(3, new ScoreStatistics());
    }
  }
}

第二步:利用 Keys 属性遍历与条件筛选

接下来需要通过遍历主字典中的数据来计算各班的总分。通过访问字典对象的 Keys 属性,可以直接获取包含所有键(即班级 ID)的集合。使用 foreach 语句配合 var 关键字便可轻松迭代这些班级编号。

在实际业务逻辑中,为了增强代码健壮性,通常会先校验当前处理的 Key 是否已经存在于目标结果字典中。此时可调用 ContainsKey 方法执行判断操作,该方法如果返回 true,说明该 Key 已存在,方可继续进入内部的统计运算环节。

      // 获取所有的键集合
      Dictionary<int, List<ScoreReport>>.KeyCollection keyCollection = scoreDictionary.Keys;
      
      foreach (var key in keyCollection)
      {
        // 校验目标统计字典中是否已包含该 Key
        if (scoreStatisticsDictionary.ContainsKey(key))
        {
          // ...执行具体的取值与计算逻辑
        }
      }

第三步:通过 TryGetValue 获取值并执行 LINQ 聚合计算

当确定了班级编号的有效性后,就需要从主字典中提取出该班级下具体包含的学生对象列表。这里采用 TryGetValue 方法进行取值。该方法接收两个参数:待查找的 Key 和一个输出变量。如果 Key 匹配成功,它将把关联的 Value 赋值给输出变量并返回 true,这能有效避免因 Key 不存在而直接抛出异常的情况。

取得学生列表后,借助 Linq 提供的扩展方法 Sum,可以非常简洁地遍历当前列表并对特定字段(如语文分数)求和。最后,利用取得的总人数(count)计算出各项科目的平均值,并将结果写入统计字典中。

          if (scoreList != null && scoreList.Count > 0)
          {
            int count = scoreList.Count; // 获取班级人数
            ScoreStatistics scoreStatistics = new ScoreStatistics();
            scoreStatisticsDictionary.TryGetValue(key, out scoreStatistics);
            
            // 设置当前班级ID
            scoreStatistics.ClassId = key;
            
            // 使用 Sum 进行分数累加
            scoreStatistics.TotalChineseScore = scoreList.Sum(it => it.ChineseScore);
            scoreStatistics.TotalMathScore = scoreList.Sum(it => it.MathScore);
            scoreStatistics.TotalEnglishScore = scoreList.Sum(it => it.EnglishScore);
            
            // 计算平均值
            scoreStatistics.AverageChineseScore = scoreStatistics.TotalChineseScore / count;
            scoreStatistics.AverageMathScore = scoreStatistics.TotalMathScore / count;
            scoreStatistics.AverageEnglishScore = scoreStatistics.TotalEnglishScore / count;
          }

第四步:输出统计结果并验证运行效果

所有班级的统计逻辑完成后,再次遍历存储结果的 scoreStatisticsDictionary,将各个班级的总分和平均分打印到控制台进行查看。运行上述代码后将得到如下预期的表格输出:

总结核心知识点

通过本示例我们可以清晰地看到 C# 中 Dictionary 类在处理结构化数据时的便利性与高效性:第一,使用 Add 方法可以向字典安全地注入键值对;第二,使用 ContainsKey 方法能在读取前精准识别键的存在与否,防止无效访问;第三,通过 Keys 属性可以轻松展开整个键集合并进行顺序或条件迭代;第四,运用 TryGetValue 是获取实际 Value 数据最稳妥的方式,配合 Linq 能极大地简化复杂的统计归纳工作。以上就是关于C# Dictionary类基本操作的详细内容,更多关于C#编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。