C# 实现Dictionary读写文件时二次加载报键已存在问题咨询
问题根因
- 存储时给每行键值对加了
[]包裹,但读取逻辑没有去除每行首尾的方括号,也没有处理分隔后键值两端的多余空格,导致解析出的键和预期不符 - 每行仅存储1组键值对,不需要内层的
i += 2循环逻辑,多余的遍历逻辑存在数组越界风险 - 直接调用
Dictionary.Add()方法添加键值,只要键重复(哪怕是解析错误产生的异常重复键)就会抛出异常,中断加载流程,因此字典最终仍为初始空状态 StreamReader未正确释放资源,可能引发文件占用异常,也没有处理文件不存在的边界场景
修复方案
方案1:保留原有文本存储格式,仅修改读取逻辑
private void Form1_Load(object sender, EventArgs e) { // 初始化字典保证初始状态为空 names = new Dictionary<string, string>(); // 文件不存在时直接跳过加载 if (!File.Exists("myfile.txt")) { return; } // 使用using自动释放StreamReader资源 using (StreamReader sr = new StreamReader("myfile.txt")) { string line; while ((line = sr.ReadLine()) != null) { // 跳过空行 if (string.IsNullOrWhiteSpace(line)) { continue; } // 去除首尾的方括号和多余空格 line = line.Trim().Trim('[', ']'); // 按逗号最多拆分2段,避免值本身含逗号时解析出错 string[] arr = line.Split(',', 2); if (arr.Length != 2) { continue; // 跳过格式错误的行 } string key = arr[0].Trim(); string value = arr[1].Trim(); // 用索引赋值替代Add方法,重复键直接覆盖,不会抛出异常 names[key] = value; } } }
原有保存逻辑无需修改。
方案2:改用Json序列化(更稳定,推荐)
不需要手动处理文本拆分逻辑,避免格式解析出错,代码更简洁可靠:
修改后的保存逻辑
private void btnExit_Click(object sender, EventArgs e) { string json = System.Text.Json.JsonSerializer.Serialize(names); File.WriteAllText("myfile.txt", json); this.Close(); }
修改后的读取逻辑
private void Form1_Load(object sender, EventArgs e) { names = new Dictionary<string, string>(); if (File.Exists("myfile.txt")) { string json = File.ReadAllText("myfile.txt"); names = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(json) ?? names; } }
内容的提问来源于stack exchange,提问作者Avmeade
相关产品推荐
相关产品推荐

