如何简化这段C#文件存在性判断的嵌套代码?
代码简化与问题分析
原代码存在的问题
- 空的
if块(if (File.Exists(...)) { })完全冗余,既无实际逻辑又降低代码可读性 - 多层嵌套的
if-else结构让逻辑层级混乱,增加阅读和维护成本 - 遍历
systemPaths的写法偏繁琐,直观性不足
简化后的代码方案
我们可以把所有候选路径按优先级整理成序列,依次检查后找到第一个存在的文件路径赋值给a,逻辑更清晰:
var a = string.Empty; // 按优先级生成候选路径列表 var candidatePaths = new List<string> { Path.Combine(modelPath, "attributes", filename), GetSaveAsAttribute(firmPath) }; // 添加systemPaths对应的所有候选路径 candidatePaths.AddRange(systemPaths.Select(p => GetSaveAsAttribute(p))); // 遍历候选路径,找到第一个存在的文件 foreach (var path in candidatePaths) { if (File.Exists(path)) { a = path; break; } }
如果项目中使用LINQ,还可以进一步简化为一行代码:
var a = new[] { Path.Combine(modelPath, "attributes", filename), GetSaveAsAttribute(firmPath) } .Concat(systemPaths.Select(p => GetSaveAsAttribute(p))) .FirstOrDefault(File.Exists) ?? string.Empty;
说明
- 两种方案完全保留原代码的逻辑优先级:先检查
modelPath组合的路径,再检查firmPath对应的路径,最后遍历systemPaths找到第一个存在的路径 - 移除了冗余的空
if块,代码结构更清爽,逻辑一目了然 - LINQ版本更简洁,若团队对LINQ熟悉度较高可选用;foreach版本可读性更强,适合所有场景
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

