C# Dictionary键值对集合使用实例
在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#编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









