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

C# WPF开发中使用StreamReader删除CSV记录遇循环报错问题求解

问题排查与修复方案

核心错误点

  • 你初始化了空的lines列表后,没有任何将CSV文件内容读取到列表的操作,lines.Count永远为0,自然不会进入for循环分支
  • 你修改循环条件为i <= lines.Count后,空列表的lines.Count=0,i=0时进入循环访问lines[0],不存在对应索引元素,直接触发索引越界错误
  • 现有代码中StreamReader只打开了文件,没有执行ReadLine()读取操作,while (!reader.EndOfStream)会变成死循环卡住程序
  • 就算完成了内存中列表的元素删除,也没有把修改后的内容写回源CSV文件,修改不会实际生效

修复后的代码示例

private void DeleteCategory(object sender, RoutedEventArgs e)
{
    // 先校验用户输入不能为空,避免误删所有数据
    string category = inputCategoryDelete.Text.Trim();
    if (string.IsNullOrEmpty(category))
    {
        // 此处可自定义添加输入为空的提示逻辑
        return;
    }

    string filePath = @"C:\Users\ashle\OneDrive\Documents\Object Orientated Programming\Practise\CSV Files\animalcategory.csv";
    try
    {
        // 读取CSV所有行到列表
        List<string> lines = File.ReadAllLines(filePath).ToList();

        // 移除所有匹配开头的行(如果需要精准匹配某列,可拆分后判断对应字段)
        lines.RemoveAll(line => line.StartsWith(category));

        // 将修改后的内容写回CSV文件
        File.WriteAllLines(filePath, lines);

        // 这里需要刷新你绑定DataGrid的数据源,让界面同步更新
        // 比如你的数据源是categoryList的话,重新读取赋值后通知属性变更即可
    }
    catch (IOException ex)
    {
        // 捕获文件被占用、无权限等IO异常,可自定义添加错误提示逻辑
        Console.WriteLine($"操作失败:{ex.Message}");
    }

    // 关闭弹窗
    addCategoryPopup.IsOpen = false;
}

额外注意事项

  • 如果你的CSV有表头,要注意跳过表头行的匹配,避免把表头误删
  • 建议不要写死绝对文件路径,后续换设备运行会找不到文件,可以用相对路径或者配置文件存储路径
  • 如果CSV有多列,建议按分隔符(一般是逗号)拆分每行内容后匹配指定列,避免出现类别名和其他字段开头重复的误删情况
  • 如果文件很大,再考虑用StreamReader逐行读取写入临时文件,替换原文件的方式处理,小文件直接用File.ReadAllLines更简洁不易出错

内容的提问来源于stack exchange,提问作者ash1997

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:42:03