编辑
2026-05-31
C#
0

目录

🔧 开篇
📌 上节回顾
💡 核心知识讲解
Dictionary 是什么?用工厂比喻来理解
Dictionary vs List,到底用哪个?
Dictionary 的基本操作,就这几招
💻 VS2026 操作步骤
📋 完整代码示例
🏭 工业实战小案例
⚠️ 避坑提醒
「这几个坑,我替你踩过了」
📝 本节总结

🔧 开篇

你有没有遇到过这种情况:

系统要显示车间里每台设备的实时温度,你用List存了一堆数值,结果领导问"3号注塑机现在多少度"——你得从头遍历整个列表,一个一个比对设备编号,代码写了一大堆,还容易出错。

更难受的是,设备一多,这段代码就开始"失控"。

其实,这个问题用一个数据结构就能解决——Dictionary字典集合。今天这篇,就把这个工具讲清楚,让你以后管设备数据,像查字典一样快。


📌 上节回顾

「上一节我们学了 List<T> 泛型集合,掌握了用有序列表存储和遍历一组同类型数据的方法。今天在这个基础上,我们进一步学习 Dictionary<K,V> 字典集合——一种支持"按名字查数据"的更强大工具。」


💡 核心知识讲解

Dictionary 是什么?用工厂比喻来理解

你见过车间里的"设备档案柜"吗?

每个抽屉上贴着设备编号(比如"CNC-03"),打开抽屉就能看到这台设备的所有参数。你不需要从第一个抽屉翻到最后一个,直接按编号找,秒取。

Dictionary 就是这个档案柜。

  • Key(键):抽屉上的编号标签,唯一,不能重复
  • Value(值):抽屉里装的内容,可以是任意类型

用代码来说,就是这样声明:

csharp
Dictionary<string, double> deviceTemperature = new Dictionary<string, double>();

这一行的意思是:创建一个字典,Key 是设备编号(string类型),Value 是温度值(double类型)。


Dictionary vs List,到底用哪个?

很多初学者容易混淆这两个集合,一张表帮你分清楚:

对比项List<T>Dictionary<K,V>
数据组织方式按顺序排列(像流水线)按键值对存储(像档案柜)
查找方式按索引或遍历查找按Key直接定位
适用场景顺序处理、批量遍历按名称快速查询
查找速度数据越多越慢无论多少条,速度稳定

「结论:要按设备编号、产品型号、工位名称查数据,优先用 Dictionary。」


Dictionary 的基本操作,就这几招

① 添加数据(Add)

csharp
deviceTemperature.Add("CNC-01", 68.5); deviceTemperature.Add("CNC-02", 72.3);

② 查询数据

直接用 Key 取值,就像查字典:

csharp
double temp = deviceTemperature["CNC-01"]; // 返回 68.5

③ 更新数据

Key 存在时,直接赋值就是更新:

csharp
deviceTemperature["CNC-01"] = 71.0; // 温度更新了

④ 判断 Key 是否存在(重要!)

这一步初学者最容易忘,后面避坑环节会重点说。

csharp
if (deviceTemperature.ContainsKey("CNC-03")) { Console.WriteLine(deviceTemperature["CNC-03"]); }

⑤ 删除数据

csharp
deviceTemperature.Remove("CNC-02");

⑥ 遍历所有数据

csharp
foreach (var item in deviceTemperature) { Console.WriteLine($"设备:{item.Key},温度:{item.Value}°C"); }

C# 14 新写法:更简洁的初始化

在 .NET 10 + C# 14 环境下,Dictionary 支持更简洁的集合表达式初始化写法:

csharp
// C# 14 集合表达式风格(更简洁) var alarmThreshold = new Dictionary<string, double> { ["CNC-01"] = 80.0, ["CNC-02"] = 85.0, ["WELD-01"] = 120.0 };

「这种写法叫"索引器初始化",比老写法少敲很多字,推荐在新项目中使用。」


💻 VS2026 操作步骤

Step 1:新建控制台项目

打开 VS2026,选择 文件 > 新建 > 项目,搜索"控制台应用",选择 .NET 10 框架,项目名填 DictionaryDemo,点击创建。

Step 2:在 Program.cs 中编写代码

打开 Program.cs,将默认的 Hello World 代码清空,按照下方完整示例粘贴代码。

VS2026 Copilot 辅助:输入 // 创建设备温度字典 后按 Tab,Copilot 会自动补全 Dictionary 声明和初始化代码,按需接受或修改。

Step 3:运行并查看输出

F5 或点击顶部工具栏的 ▶ 运行 按钮,在下方"输出"窗口查看控制台打印结果。

VS2026 Copilot 辅助:如果运行报错,Copilot 会在错误行旁边显示"灯泡图标",点击后给出修复建议,初学者直接选第一条建议通常就能解决。

Step 4(Vibe Coding 提示词写法)

如果你想让 Copilot 帮你生成整段代码,可以在注释里这样写 Prompt:

// 用 Dictionary<string, double> 存储5台CNC设备的实时温度, // 实现添加、查询、更新、遍历功能, // 查询时用 TryGetValue 避免 KeyNotFoundException

输入完按 Enter,Copilot 会自动生成完整代码块,你只需审查逻辑是否符合需求。


📋 完整代码示例

这段代码实现了一个简单的车间设备温度字典管理器,包含增删改查和安全访问的完整演示。

csharp
// ============================================= // 示例:车间设备温度字典管理 // 适用:.NET 10 + C# 14 + VS2026 // ============================================= using System; using System.Collections.Generic; // 创建设备温度字典:Key=设备编号,Value=当前温度(℃) var deviceTemperature = new Dictionary<string, double> { ["CNC-01"] = 68.5, ["CNC-02"] = 72.3, ["WELD-01"] = 115.8, ["INJECT-01"] = 210.0 // 注塑机温度较高 }; Console.OutputEncoding = System.Text.Encoding.UTF8; // 允许输出特殊符号 Console.WriteLine("=== 车间设备温度监控 ===\n"); // ① 遍历输出所有设备温度 Console.WriteLine("【当前所有设备温度】"); foreach (var device in deviceTemperature) { string status = device.Value > 100 ? "⚠️ 注意" : "✅ 正常"; Console.WriteLine($" {device.Key,-12} {device.Value,6:F1}°C {status}"); } // ② 安全查询:用 TryGetValue 避免崩溃 Console.WriteLine("\n【查询指定设备】"); string queryTarget = "CNC-02"; if (deviceTemperature.TryGetValue(queryTarget, out double currentTemp)) { Console.WriteLine($" {queryTarget} 当前温度:{currentTemp:F1}°C"); } else { Console.WriteLine($" 设备 {queryTarget} 不存在,请检查编号"); } // ③ 更新温度(模拟采集到新数据) Console.WriteLine("\n【更新 CNC-01 温度】"); deviceTemperature["CNC-01"] = 91.2; Console.WriteLine($" CNC-01 温度已更新为:{deviceTemperature["CNC-01"]:F1}°C"); // ④ 报警阈值字典:每台设备阈值不同 var alarmThreshold = new Dictionary<string, double> { ["CNC-01"] = 90.0, ["CNC-02"] = 90.0, ["WELD-01"] = 130.0, ["INJECT-01"] = 240.0 }; // ⑤ 交叉比对:检查哪些设备超温 Console.WriteLine("\n【超温报警检查】"); foreach (var device in deviceTemperature) { // 用 TryGetValue 安全获取该设备的阈值 if (alarmThreshold.TryGetValue(device.Key, out double threshold)) { if (device.Value >= threshold) { Console.WriteLine($" ❌ 报警!{device.Key} 温度 {device.Value:F1}°C,超过阈值 {threshold:F1}°C"); } else { Console.WriteLine($" ✅ {device.Key} 温度正常({device.Value:F1}°C / 阈值{threshold:F1}°C)"); } } } // ⑥ 移除已下线设备 Console.WriteLine("\n【移除下线设备 WELD-01】"); deviceTemperature.Remove("WELD-01"); Console.WriteLine($" 当前在线设备数:{deviceTemperature.Count} 台");

image.png

运行后,你会看到控制台按格式打印出所有设备的温度和状态标记。更新 CNC-01 温度后,报警检查会立刻识别出它已超过阈值 90°C,并输出红色报警提示。整个流程走下来,你就能感受到 Dictionary 在设备数据管理上的直观和高效。


🏭 工业实战小案例

场景任务: 注塑车间有8个工位,每个工位的模具温度设定值不同,需要根据工位编号快速查询设定温度,并与实时采集值比对,判断是否需要调整加热功率。

思路拆解:

  1. 用 Dictionary 存储每个工位的温度设定值(Key=工位编号)
  2. 用另一个 Dictionary 存储实时采集温度
  3. 遍历设定值字典,逐个与实时值比对
  4. 差值超过 ±5°C 就触发调整提示
  5. 输出每个工位的调整建议
csharp
// 注塑车间工位温度管理 // 场景:8工位模具温度设定 vs 实时采集比对 var setpointTemp = new Dictionary<string, double> { ["MOLD-01"] = 220.0, ["MOLD-02"] = 215.0, ["MOLD-03"] = 225.0, ["MOLD-04"] = 218.0 }; // 模拟实时采集到的温度(实际项目中来自PLC或OPC UA读取) var actualTemp = new Dictionary<string, double> { ["MOLD-01"] = 221.5, ["MOLD-02"] = 208.3, // 偏低,需要升温 ["MOLD-03"] = 231.0, // 偏高,需要降温 ["MOLD-04"] = 217.8 }; double toleranceBand = 5.0; // 允许偏差 ±5°C Console.OutputEncoding = System.Text.Encoding.UTF8; // 支持输出特殊符号 Console.WriteLine("=== 注塑工位温度比对报告 ===\n"); foreach (var station in setpointTemp) { string stationId = station.Key; double setpoint = station.Value; if (!actualTemp.TryGetValue(stationId, out double actual)) { Console.WriteLine($" {stationId}:⚠️ 采集数据缺失,请检查传感器"); continue; } double deviation = actual - setpoint; string action = Math.Abs(deviation) <= toleranceBand ? "✅ 温度正常,无需调整" : deviation > 0 ? $"🔽 偏高 {deviation:+0.0;-0.0}°C,建议降低加热功率" : $"🔼 偏低 {deviation:+0.0;-0.0}°C,建议提升加热功率"; Console.WriteLine($" {stationId} 设定:{setpoint:F1}°C 实际:{actual:F1}°C → {action}"); }

image.png

运行后,控制台会逐行输出每个工位的设定温度、实时温度和调整建议,MOLD-02 和 MOLD-03 会分别触发升温和降温提示,其余工位显示正常。这个逻辑直接可以嵌入你的 WinForms 或 WPF 监控界面的定时刷新方法里。


⚠️ 避坑提醒

「这几个坑,我替你踩过了」

坑 1:直接用 Key 取值,Key 不存在时程序直接崩

❌ 错误做法:double t = deviceTemperature["CNC-99"];

✅ 正确做法:deviceTemperature.TryGetValue("CNC-99", out double t);

📌 原因:Key 不存在时,[] 取值会抛出 KeyNotFoundException,程序直接挂掉;TryGetValue 会返回 false,你可以优雅处理,不影响主流程。


坑 2:重复 Add 同一个 Key,直接报错

❌ 错误做法:连续两次 deviceTemperature.Add("CNC-01", 68.5);

✅ 正确做法:deviceTemperature["CNC-01"] = 68.5;(直接赋值,存在则更新,不存在则新增)

📌 原因:Add 方法不允许 Key 重复,会抛出 ArgumentException;用索引器赋值则没有这个限制,更安全。


坑 3:在 foreach 循环里修改 Dictionary

❌ 错误做法:在 foreach (var item in dict) 循环体内执行 dict.Remove(item.Key)

✅ 正确做法:先用 var keys = dict.Keys.ToList(); 取出 Key 列表,再遍历 keys 列表进行删除

📌 原因:C# 的集合在遍历期间不允许修改,否则会抛出 InvalidOperationException,这是初学者最常踩的一个坑。


📝 本节总结

「学完本节,你掌握了:」

Dictionary<K,V> 是一种以"键值对"方式组织数据的集合,就像给每条数据贴上唯一标签,查找时直接按标签定位,速度远快于 List 的遍历查找。你学会了用 Add、索引器赋值、TryGetValueRemoveforeach 完成字典的增删改查,也知道了在 C# 14 中可以用更简洁的索引器语法初始化字典。最重要的是,你现在能把这套工具用在设备温度管理、工位参数查询这类真实工厂场景里,不再靠遍历列表"大海捞针"。

掌握了 Dictionary,你处理工业数据的思路会有一次明显的跃升——从"存数据"变成"管数据"。


📖 本文是《C# 工业数字化应用开发专家》系列第 2-4 节

上一节:【List<T> 泛型集合入门】

下一节:【方法定义与调用:参数、返回值、重载】(明天更新)

💬 你在工作中遇到过类似的需求吗?

欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。

🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这420节,从工厂小白到工业软件开发专家,我们一起走。


#C#编程入门 #工业数字化 #工厂软件开发 #Dictionary字典 #dotNET开发

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!