在Linq语句中出现了“Sequence contains no matching element”错误

9

我正在尝试调试我的方法,但是不知道哪里出问题了。

有时会抛出错误,有时就可以正常运行。我不知道哪里出了问题。

以下是我的方法代码:

private void GetWorkingWeek(int month, int year)
    {
        var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar;


        var daysInMonth = Enumerable.Range(1, cal.GetDaysInMonth(year, month));

        var listOfWorkWeeks = daysInMonth
            .Select(day => new DateTime(year, month, day))
            .GroupBy(d => cal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
            .Select(g => Tuple.Create(g.Key, g.First(), g.Last(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)))
            .ToList();
         foreach (var weekGroup in listOfWorkWeeks)
                {
                    Console.WriteLine("Week{0} = {1} {2} to {1} {3}"
                        , weekNum++
                        , System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(month)
                        , weekGroup.Item2.Day
                        , weekGroup.Item3.Day);
                }
    }

这是出错的那一行:

var listOfWorkWeeks = daysInMonth
            .Select(day => new DateTime(year, month, day))
            .GroupBy(d => cal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
            .Select(g => Tuple.Create(g.Key, g.First(), g.Last(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)))
            .ToList();

这是错误信息:
 InvalidOperationException : Sequence contains no matching element

1
我猜测是 First() 或 Last() 方法引发了错误。你可以尝试替换为 FirstOrDefault() 和 LastOrDefault(),它们会在数据集为空时返回 null 而不是触发异常。 - Dan A.
1
可能是重复的问题:Sequence contains no matching element - demongolem
1个回答

15
var listOfWorkWeeks = daysInMonth
        .Select(day => new DateTime(year, month, day))
        .GroupBy(d => cal.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
        .Select(g => Tuple.Create(g.Key, g.FirstOrDefault(), g.LastOrDefault(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)))
        .ToList();

尝试使用 FirstOrDefaultLastOrDefault 替代 FirstLast,这些方法将返回它们所调用类型的默认值,如果没有元素匹配您提供的 lambda 表达式作为参数。

对于 g.FirstOrDefault(),如果 g 为空,则将返回默认值;而对于 g.LastOrDefault(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday),则在所有日期都是周六或周日的情况下,将返回默认值。


1+ 为您解释: - Hamid Talebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接