2013-01-21 41 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()の代わりに、例外をトリガーする代わりに空のデータセットに対してnullを返すこともできます。 –

+1

[シーケンスには一致する要素が含まれていません]の重複があります(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(); 

FirstOrDefaultを使用して試してみて、 LastOrDefaultFirstLastの代わりに、これらのメソッドは、パラメータとして指定したラムダ式に一致する要素がない場合に呼び出される型のデフォルト値を返します。

g.FirstOrDefault()の場合、gが空の場合はデフォルト値が返され、g.LastOrDefault(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)の場合は、すべての日が土曜日か日曜日の場合にデフォルト値が返されます。

+0

これはありがとうございます!これは私が探しているものです! – jomsk1e

+0

これは魅力のように機能します! – Rahnzo

+0

あなたの説明のために1+ –

関連する問題