移除遍历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
相关产品推荐
相关产品推荐

