2013-01-21 21 views
9

Tôi đang cố gỡ lỗi phương thức của mình nhưng tôi không biết có gì sai với nó.Trình tự không chứa lỗi phần tử phù hợp trong Tuyên bố LINQ

Có những lúc nó phát ra lỗi và đôi khi không sao. Tôi không biết có gì sai.

Dưới đây là phương pháp của tôi:

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

Đây là dòng lỗi ở đâu xuất hiện:

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

Đây là lỗi:

InvalidOperationException : Sequence contains no matching element 
+1

Tôi đoán đó là phương thức First() hoặc Last() ném lỗi. Bạn có thể thử thay thế FirstOrDefault() và LastOrDefault() mà thay vào đó sẽ trả về null cho một tập dữ liệu rỗng thay vì kích hoạt ngoại lệ. –

+1

bản sao có thể có của [Trình tự không chứa phần tử phù hợp] (http://stackoverflow.com/questions/3994336/sequence-contains-no-matching-element) – demongolem

Trả lời

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

Hãy thử sử dụng FirstOrDefaultLastOrDefault thay vì FirstLast, các phương thức này sẽ trả lại giá trị mặc định của loại mà chúng được gọi cho nếu không có phần tử nào khớp với biểu thức lambda mà bạn cung cấp làm tham số.

Trong trường hợp g.FirstOrDefault(), giá trị mặc định sẽ được trả lại nếu g trống và trong trường hợp g.LastOrDefault(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday) giá trị mặc định sẽ được trả lại nếu tất cả các ngày là thứ bảy hoặc chủ nhật.

+0

cảm ơn vì điều này !! đây là một trong những Im tìm kiếm! – jomsk1e

+0

Điều này hoạt động giống như một sự quyến rũ! – Rahnzo

+0

1+ để giải thích của bạn –

Các vấn đề liên quan