我正在尝试调试我的方法,但我不知道它有什么问题。
有时它会抛出错误,有时又没问题。我不知道出了什么问题。
这是我的方法:
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
最佳答案
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();
尝试使用FirstOrDefault
和LastOrDefault
代替First
和Last
,这些方法将返回默认值如果没有元素与您作为参数提供的 lambda 表达式匹配,则调用它们的类型。
在 g.FirstOrDefault()
的情况下,如果 g 为空并且在 g.LastOrDefault(d => d.DayOfWeek != DayOfWeek. Saturday && d.DayOfWeek != DayOfWeek.Sunday)
如果所有日期都是星期六或星期日,则返回默认值。
关于c# - Linq语句中序列不包含匹配元素错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14433147/