2013-01-21 16 views
9

Próbuję debugować moją metodę, ale nie wiem, co jest z nią nie tak.Sekwencja nie zawiera pasującego elementu błędu w Linq Statement

Są chwile, kiedy popełnia błąd i czasami jest w porządku. Nie wiem co jest źle.

Oto moja metoda:

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); 
       } 
    } 

Jest to linia, gdzie pojawia się błąd:

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(); 

Jest to błąd:

InvalidOperationException : Sequence contains no matching element 
+1

Zgaduję, że jest to metoda First() lub Last(), która powoduje błąd. Możesz spróbować zastąpić FirstOrDefault() i LastOrDefault(), który zamiast tego zwróci wartość null dla pustego zestawu danych zamiast wyzwalania wyjątku. –

+1

możliwy duplikat [Sekwencja nie zawiera pasującego elementu] (http://stackoverflow.com/questions/3994336/sequence-contains-no-matching-element) – demongolem

Odpowiedz

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(); 

Spróbuj użyć FirstOrDefault i LastOrDefault zamiast First i Last, te metody zwrócą wartość domyślną typu, do którego są wywoływane, jeśli żaden element nie odpowiada wyrażeniu lambda podanemu jako parametr.

W przypadku g.FirstOrDefault(), wartość domyślna zostanie zwrócona, gdy g jest puste, aw przypadku g.LastOrDefault(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday) wartość domyślna zostanie zwrócona, jeśli wszystkie dni są soboty lub niedzieli.

+0

dzięki za to !! to jest ten, którego szukam! – jomsk1e

+0

To działa jak urok! – Rahnzo

+0

1+ za wyjaśnienie –

Powiązane problemy