如何优化包含多层嵌套if else的方法的性能与代码可读性
优化方案
1. 结构/可读性优化思路
- 抽离所有分支公共的查询生成逻辑,避免4个分支重复编写几乎一致的查询代码
- 简化布尔判断逻辑,去掉冗余的null判断,用原生字符串相等方法做判断更安全
- 压平嵌套层级,把三层嵌套if-else缩减为两层平级判断,逻辑走向更直观
2. 性能优化思路
- 仅对数据源执行一次查询构建,避免重复生成查询表达式带来的解析开销,EF/EF Core等ORM场景下收益更明显
- 避免不必要的
Union操作,不需要拼接结果时直接赋值,减少结果集去重的额外开销 - 提前确定查询条件,避免运行时重复判断相同的分支条件
优化后的代码示例
// 外层开关不符合直接跳过所有逻辑 if (string.Equals(inCheckbox, "true", StringComparison.Ordinal)) { // 统一生成查询逻辑,避免分支重复编码 IQueryable<对应实体类型> query; if (wordArraySplit.Length > 1) { // 修正原代码笔误:原代码中未定义的变量q应为声明的迭代变量qu query = from qu in dataInitial from p in qu.Pannea where wordArraySplit.All(word => p.Title.Contains(word)) select qu; } else { var searchWord = wordArraySplit[0]; query = dataInitial.Where(qu => qu.Pannea.Any(p => p.Title.Contains(searchWord))); } // 最后根据配置决定结果赋值逻辑 if (string.Equals(inCheckboxQu, "true", StringComparison.Ordinal)) { dataResult = dataResult.Union(query); } else { dataResult = query; } }
额外优化建议
- 可提前对
wordArraySplit做非空和长度校验,避免访问索引0时抛出越界异常 - 如果是ORM查询场景,可给
Pannea表的Title字段添加索引,大幅提升Contains查询的执行速度 - 如果结果集不需要去重,可把
Union替换为Concat,省去结果集去重的计算开销
内容的提问来源于stack exchange,提问作者Coder-Meca
相关产品推荐
相关产品推荐

