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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:28:19