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

移除遍历ServiceHours列表时获取属性的多个If语句

嘿,我完全懂你这种被一堆重复if语句搞得头大的感觉!针对你这个ServiceHours类的遍历问题,给你几个清爽的解决方案,帮你干掉那些冗余的判断:

首先先把你的模型贴出来方便上下文参考:

public class ServiceHours { 
    public int Id { get; set; } 
    ... 
    public TimeSpan? Monday { get; set; } 
    public TimeSpan? Tuesday { get; set; } 
    public TimeSpan? Wednesday { get; set; } 
    public TimeSpan? Thursday { get; set; } 
    public TimeSpan? Friday { get; set; } 
    public TimeSpan? Saturday { get; set; } 
    public TimeSpan? Sunday { get; set; } 
}

方案1:手动映射属性委托(性能最优)

这种方式不需要反射,完全是强类型的,性能最好,也容易维护:

首先可以先定义一个星期枚举(方便后续业务逻辑处理):

public enum Weekday
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

然后创建一个属性映射字典,把每个星期几和对应的属性访问逻辑绑定:

// 提前初始化一次,不用每次遍历都创建
var weekdayPropertyMap = new Dictionary<Weekday, Func<ServiceHours, TimeSpan?>>
{
    { Weekday.Monday, sh => sh.Monday },
    { Weekday.Tuesday, sh => sh.Tuesday },
    { Weekday.Wednesday, sh => sh.Wednesday },
    { Weekday.Thursday, sh => sh.Thursday },
    { Weekday.Friday, sh => sh.Friday },
    { Weekday.Saturday, sh => sh.Saturday },
    { Weekday.Sunday, sh => sh.Sunday }
};

接下来遍历你的service hour集合时,直接循环这个字典就行:

foreach (var serviceHour in yourServiceHoursCollection)
{
    foreach (var (weekday, getTimeSpan) in weekdayPropertyMap)
    {
        var timeValue = getTimeSpan(serviceHour);
        if (timeValue.HasValue)
        {
            // 这里写你要处理的逻辑,比如记录、展示等
            Console.WriteLine($"服务时间 - {weekday}: {timeValue.Value}");
        }
    }
}

方案2:利用反射自动匹配属性(无需手动维护映射)

如果你的属性命名严格和星期几一致(比如Monday、Tuesday),可以用反射自动获取这些属性,省去手动维护映射的麻烦:

// 提前获取所有符合条件的属性:类型是TimeSpan?,名称是星期枚举的成员
var weekdayProperties = typeof(ServiceHours)
    .GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(prop => 
        typeof(TimeSpan?).IsAssignableFrom(prop.PropertyType)
        && Enum.TryParse<Weekday>(prop.Name, out _))
    .ToList();

foreach (var serviceHour in yourServiceHoursCollection)
{
    foreach (var prop in weekdayProperties)
    {
        var timeValue = (TimeSpan?)prop.GetValue(serviceHour);
        if (timeValue.HasValue)
        {
            var weekday = (Weekday)Enum.Parse(typeof(Weekday), prop.Name);
            Console.WriteLine($"服务时间 - {weekday}: {timeValue.Value}");
        }
    }
}

注意:反射的性能比方案1略低,如果是处理超大量数据的场景,优先选方案1;普通业务场景下这点性能差异可以忽略。

方案3:重构模型(最优雅的长期方案)

如果你的项目允许修改ServiceHours模型的结构,那直接把分散的星期属性改成一个集合会更合理:

public class ServiceHours
{
    public int Id { get; set; }
    // 其他原有属性...
    // 用字典存储每天的可选时间,键是星期枚举
    public Dictionary<Weekday, TimeSpan?> DailyServiceHours { get; set; } = new();
}

这样遍历的时候直接循环DailyServiceHours就行,完全不需要任何额外的映射或判断:

foreach (var serviceHour in yourServiceHoursCollection)
{
    foreach (var (weekday, timeValue) in serviceHour.DailyServiceHours)
    {
        if (timeValue.HasValue)
        {
            // 处理逻辑
            Console.WriteLine($"服务时间 - {weekday}: {timeValue.Value}");
        }
    }
}

提示:如果这个模型和ORM(比如EF Core)绑定,只需要配置一下字典的存储转换即可,比如用HasConversion把字典转成JSON存储在数据库字段里。


内容的提问来源于stack exchange,提问作者Dan Walsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:45:07