C#中高效比较多变量与同一值并复用后续逻辑的方法
优化C#中多变量同值比较及复用逻辑的方案
当然有办法解决这个问题!你的核心需求是避免重复编写if判断和相同的方法调用代码,C#提供了多种简洁的方式来实现这个目标,下面我给你几个实用的优化方案:
方案1:用元组集合批量处理,优先处理第一个错误
如果你只需要处理第一个出现的非空错误(和你原来的if/else逻辑一致),可以把每个检查的结果、错误信息打包成元组,放到集合里统一处理:
// 先将需要检查的结果与对应的错误信息配对 var errorEntries = new List<(PatientList3 Results, string Error)> { (DOBResults, DOBResultsError), (NameResults, NameResultsError) }; // 筛选出第一个非空的错误项 var firstError = errorEntries.FirstOrDefault(entry => !string.IsNullOrEmpty(entry.Error)); // 存在错误时执行统一逻辑 if (!string.IsNullOrEmpty(firstError.Error)) { PatientRecordUpdate(firstError.Results, APIParameters.PatientID, firstError.Error); }
这个方案的好处是:后续新增更多检查项时,只需要往errorEntries里添加新的元组即可,不需要修改判断逻辑,扩展性很强。
方案2:封装判断逻辑为辅助方法,简化调用
如果希望保持每个检查的独立性,但又不想重复写if判断,可以把错误判断和方法调用封装成一个小方法:
// 封装重复的判断与调用逻辑 private void ProcessPatientError(PatientList3 results, int patientId, string errorMessage) { if (!string.IsNullOrEmpty(errorMessage)) { PatientRecordUpdate(results, patientId, errorMessage); } } // 调用时只需传入对应参数,简洁清晰 ProcessPatientError(DOBResults, APIParameters.PatientID, DOBResultsError); ProcessPatientError(NameResults, APIParameters.PatientID, NameResultsError);
这种方式把重复的逻辑抽离出来,以后如果需要修改错误判断规则(比如改成判断string.IsNullOrWhiteSpace),只需要修改辅助方法即可,不用逐个修改调用处。
方案3:批量生成并处理所有错误(如果需要处理全部错误)
如果你需要处理所有非空的错误(而不是只处理第一个),可以直接在生成错误信息时就进行批量处理:
// 批量生成错误信息并过滤出非空项 var allErrors = new[] { (Results: DOBResults, Error: VerifySingleRecordReturned(DOBResults, APIParameters, 1)), (Results: NameResults, Error: VerifySingleRecordReturned(NameResults, APIParameters, 2)) }.Where(item => !string.IsNullOrEmpty(item.Error)); // 遍历处理每个错误 foreach (var error in allErrors) { PatientRecordUpdate(error.Results, APIParameters.PatientID, error.Error); }
这个方案省去了单独存储每个错误变量的步骤,直接链式完成错误生成、过滤和处理,代码更紧凑。
关于switch的补充说明
你提到用switch无法解决这个问题是对的——switch更适合处理单一变量的多分支判断,没法直接关联多个变量和对应的逻辑复用。而上面的集合/封装方法的思路,更贴合你这种“多变量同规则判断+复用处理逻辑”的场景。
内容的提问来源于stack exchange,提问作者W.Harr
相关产品推荐
相关产品推荐

