C#二维字符串数组元素与字符串变量==相等判定不生效问题求助
问题根因
- 写入分类、名称时调用的
WriteLine()方法会在内容末尾自动追加Windows默认换行符\r\n,读取时仅按\n分割字符串,导致分割后的每个字符串末尾残留看不见的\r字符,实际内容与选中分类不一致,因此==比较不生效。 - 遍历固定长度二维数组时会访问未赋值的null元素,也会导致比较返回false,属于潜在风险。
快速修复方案
- 替换手动读取+分割的逻辑,使用.NET 内置的
File.ReadAllLines()方法,会自动处理不同格式的换行符并过滤掉换行符,无需手动处理分割逻辑:
// 替换原有StreamReader读取、Split分割的代码 string[] current_cat = File.ReadAllLines(path_category, Encoding.UTF8); string[] current_nam = File.ReadAllLines(path_name, Encoding.UTF8);
- 字符串比较前增加空校验、首尾空白字符过滤逻辑,进一步避免隐形字符问题:
if(!string.IsNullOrEmpty(values[1, i]) && values[1, i].Trim() == category_read.Trim()) { // 匹配成功的逻辑 }
排查小技巧:可以打断点查看两个比较字符串的
Length属性,若长度不同就说明存在隐形字符。
优化实现建议
- 避免分开存储分类、名称两个独立文件,容易出现行数错位匹配错误。可以定义结构化存储类,使用JSON序列化存储列表数据,.NET 内置
System.Text.Json可直接完成序列化/反序列化操作,无需手动处理文本分割逻辑:
// 定义存储结构 public class TextRecord { public string Category { get; set; } public string Name { get; set; } } // 存储时直接序列化List<TextRecord>到JSON文件 // 读取时直接反序列化为List<TextRecord>使用
- 替换固定长度二维数组为
List<T>动态集合,没有存储上限限制,也无需处理空元素遍历问题。 - 所有文件操作使用
using块包裹,避免异常时文件句柄未释放导致的文件占用错误。 - 路径拼接使用
Path.Combine()方法,无需手动处理斜杠,适配性更强。 - 不要吞掉所有异常,catch块中增加错误提示逻辑,方便排查问题。
内容的提问来源于stack exchange,提问作者Tobias Schober
相关产品推荐
相关产品推荐

