2013-01-21 27 views
9

我想调试我的方法,但我不知道它有什么问题。序列在Linq语句中没有匹配的元素错误

有时候会抛出错误,有时候也没关系。我不知道什么是错的。

这里是我的方法:

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()来代替空的数据集,而不是触发异常。 –

+1

[Sequence contains no matching element]可能重复(http://stackoverflow.com/questions/3994336/sequence-contains-no-matching-element) – demongolem

回答

13
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),则在所有日期为星期六或星期日时返回默认值。

+0

感谢您的支持!这是我寻找的那个! – jomsk1e

+0

这就像一个魅力! – Rahnzo

+0

1+供您解释 –

相关问题