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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:24:03