You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何按规则从字符串状态列表计算最终状态并优化实现

状态列表判定逻辑优化方案

原有代码问题

你当前的实现存在3个明显问题,无法满足业务要求:

  • 逻辑bug:先通过Where(x => x == "Approved")把集合过滤为仅包含Approved状态,后续在过滤后的集合中查找Rejected永远无法命中,驳回规则完全失效
  • 分支错误:第一个全Approved的判断没有配套else分支,当所有状态都是Approved时,会先输出Approved,再进入后续else分支输出Submitted,出现重复输出
  • 性能冗余:多次遍历集合执行过滤、计数操作,数据量较大时存在不必要的性能损耗,且硬编码字符串容易因拼写错误引发问题。

判定规则优先级梳理

你的业务规则存在明确的优先级,必须按从高到低顺序判断:

  1. 最高优先级:只要存在任意Rejected,直接返回Rejected
  2. 次优先级:无Rejected但存在Submitted,返回Submitted
  3. 最低优先级:所有状态均为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);

通用最佳实践版

为了提升可维护性、复用性和性能,推荐做两点优化:用枚举替代硬编码魔法字符串,封装通用判断方法,单次遍历即可完成判定:

  1. 首先定义状态枚举,从根源避免字符串拼写错误:
public enum FormStatus
{
    Submitted,
    Approved,
    Rejected
}
  1. 封装可复用的扩展方法,支持任意可枚举的状态集合直接调用:
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;
    }
}
  1. 调用方式非常简单:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:15:44