2013-01-21 31 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+供您解釋 –

相關問題