C#中使用Predicate查找DayOfWeek时周日匹配异常问题咨询
嘿,我一眼就看出你踩了C#枚举默认值和List<T>.Find()方法的坑了!
问题根源
先给你划重点:List<T>.Find() 方法在找不到匹配元素时,会返回 T 的默认值。而DayOfWeek这个枚举里,Sunday对应的枚举值是0——正好是枚举类型的默认值!
你大概率是直接把Find的返回值和DayOfWeek.Sunday做相等判断,来确认是否找到目标日期。但当列表为空或者不含周日时,Find返回的默认值就是Sunday,这就让你误以为“找到了”,实际上根本没有匹配的元素!
为啥其他日期没问题?因为除了Sunday,其他DayOfWeek成员的枚举值都不是0(比如Monday是1,Tuesday是2...),找不到时返回的默认值(Sunday)和它们不相等,自然不会出现误判,只有找Sunday的时候才会踩这个专属坑😂
修复方案
给你几个实用的解决办法,按需选:
1. 最简洁:直接用Contains()
如果你只是想判断列表里有没有周日,Contains()是最省心的,直接返回布尔值,完全不会有默认值混淆的问题:
bool hasSunday = day.Contains(DayOfWeek.Sunday);
2. 用Exists()做存在性判断
和Contains()类似,Exists()接收一个Predicate,适合需要更复杂判断的场景(不过你这个场景用Contains足够):
bool hasSunday = day.Exists(d => d == DayOfWeek.Sunday);
3. 用FindIndex()区分找到/没找到
如果需要知道匹配元素的位置,可以用FindIndex()——找不到时会返回-1,非常明确:
int sundayIndex = day.FindIndex(d => d == DayOfWeek.Sunday); bool hasSunday = sundayIndex != -1;
4. 要获取元素?用可空类型规避默认值
如果你确实需要拿到找到的周日元素(而不只是判断存在),可以用Nullable<DayOfWeek>(也就是DayOfWeek?)来处理,避免默认值干扰:
DayOfWeek? foundSunday = day.FirstOrDefault(d => d == DayOfWeek.Sunday) as DayOfWeek?; if (foundSunday.HasValue) { // 真的找到了周日,做你要的操作 } else { // 列表里没有周日 }
验证场景
用上面的方法测试你的场景:
- 空列表:返回
false,不会误判 - 不含周日的列表:返回
false,正确 - 包含周日的列表:返回
true,正常匹配
内容的提问来源于stack exchange,提问作者LeWho38
相关产品推荐
相关产品推荐

