C#如何按规则从字符串状态列表计算最终状态并优化实现
状态列表判定逻辑优化方案
原有代码问题
你当前的实现存在3个明显问题,无法满足业务要求:
- 逻辑bug:先通过
Where(x => x == "Approved")把集合过滤为仅包含Approved状态,后续在过滤后的集合中查找Rejected永远无法命中,驳回规则完全失效 - 分支错误:第一个全Approved的判断没有配套else分支,当所有状态都是Approved时,会先输出Approved,再进入后续else分支输出Submitted,出现重复输出
- 性能冗余:多次遍历集合执行过滤、计数操作,数据量较大时存在不必要的性能损耗,且硬编码字符串容易因拼写错误引发问题。
判定规则优先级梳理
你的业务规则存在明确的优先级,必须按从高到低顺序判断:
- 最高优先级:只要存在任意
Rejected,直接返回Rejected - 次优先级:无
Rejected但存在Submitted,返回Submitted - 最低优先级:所有状态均为
Approved,返回Approved
基础修正版(保留字符串类型实现)
如果暂时不调整数据类型,最简正确实现如下,仅需2次Contains判断即可覆盖所有场景,逻辑清晰无冗余:
List<string> statuses = new List<string>() { "Approved", "Approved", "Approved" }; string finalStatus; if (statuses.Contains("Rejected")) { finalStatus = "Rejected"; } else if (statuses.Contains("Submitted")) { finalStatus = "Submitted"; } else { finalStatus = "Approved"; } Console.WriteLine(finalStatus);
通用最佳实践版
为了提升可维护性、复用性和性能,推荐做两点优化:用枚举替代硬编码魔法字符串,封装通用判断方法,单次遍历即可完成判定:
- 首先定义状态枚举,从根源避免字符串拼写错误:
public enum FormStatus { Submitted, Approved, Rejected }
- 封装可复用的扩展方法,支持任意可枚举的状态集合直接调用:
public static class StatusExtensions { public static FormStatus GetFinalStatus(this IEnumerable<FormStatus> statusList) { if (statusList == null || !statusList.Any()) { // 空集合处理逻辑可根据业务调整,这里示例为抛出参数异常,也可返回指定默认状态 throw new ArgumentException("状态集合不能为空"); } bool hasSubmitted = false; foreach (var status in statusList) { // 命中最高优先级规则直接返回,无需遍历后续元素 if (status == FormStatus.Rejected) { return FormStatus.Rejected; } if (status == FormStatus.Submitted) { hasSubmitted = true; } } return hasSubmitted ? FormStatus.Submitted : FormStatus.Approved; } }
- 调用方式非常简单:
List<FormStatus> statuses = new List<FormStatus> { FormStatus.Approved, FormStatus.Approved, FormStatus.Submitted }; var finalStatus = statuses.GetFinalStatus(); Console.WriteLine(finalStatus);
该版本优势
- 性能最优:遍历过程中一旦遇到Rejected就立刻终止返回,最坏情况才遍历完整集合,比多次调用Where/Contains/Count的多轮迭代效率高很多
- 可维护性强:枚举替代字符串后,拼写错误会直接在编译阶段暴露,不需要等到运行时排查问题,后续新增状态时扩展逻辑也很方便
- 复用性高:任意实现
IEnumerable<FormStatus>的集合(数组、List、EF查询结果等)都可以直接调用该方法,不需要重复编写判断逻辑 - 逻辑严谨:严格按照优先级顺序判断,没有冗余分支,不会出现重复输出、规则不命中的问题
内容的提问来源于stack exchange,提问作者Muhammad Kamran
相关产品推荐
相关产品推荐

