2013-08-02 168 views
1

兩個日期屬性我有兩個列表:比較列表

List<DateTime> monthWorkingDays 

List<Note> monthUserNotes 

在我的筆記類我有一個日期時間NoteDate財產(代表音符的日期)。

我需要檢查用戶是否在工作日內沒有發送任何信息給該用戶發送電子郵件。

所以我必須比較NoteDate屬性與monthWorkingDays數據。

public List<DateTime> GetIncompleteDays() 
    { 
     var days = GetWorkingDays(); 
     var incompleteDays = new List<DateTime>(); 
     var notes = GetLast30DaysNotesByUser(idUser).OrderBy(a => a.NoteDate); 

      foreach (var note in notes) 
      { 
       //TODO 
      } 

     return incompleteDays; 
    } 

有什麼建議嗎? 感謝

+0

您需要一個double for循環。如果你可以比較(>,<)註釋日期,那麼你可以更早地跳出內部循環(如果你有匹配,肯定會中斷)。 – Jiminion

回答

1

不排序票據由日期 - 選擇排序不全天,而不是:

days.Select(d => d.Date) 
    .Except(notes.Select(n => n.NoteDate)) 
    .OrderBy(d => d) 

蒂姆說,你可能不需要選擇d => d.Date如果幾天沒有時間部分。考慮引入一些解釋變量,以使解決方案更加清晰:

var workingDays = GetWorkingDays(); 
var notes = GetLast30DaysNotesByUser(idUser); 
var daysWithNotes = notes.Select(n => n.NoteDate).Distinct(); 
var incompleteDays = workingDays.Except(daysWithNotes); 
+0

我只有NoteDate屬性的Date部分。我把時間保留在其他屬性中,只有Date(代表用戶在系統中創建Note的時刻) – gog

+0

@ggui啊,好吧,我會更新答案以使其更加清晰。順便說一句我認爲'GetLastMonthNotesOfUser(userId)'是方法的一個更好的名稱。另外,如果你的'GetWoringDays()'方法返回上個月的工作日,最好命名爲'GetLastMonthWorkingDays()' –

+0

你是對的,名字很醜。但它不能上個月,因爲它不是上個月,實際上是最後30天。但不管怎樣,生病都會改變它。謝謝 – gog

3

假設你DateTime s爲相當(如果有時間部分,您可以刪除與DateTime.Date屬性),這應該工作,使用LINQ的Except

var incompleteDays = days.Except(
     GetLast30DaysNotesByUser(idUser).Select(a => a.NoteDate)); 
+0

令人驚訝的是,我試圖讓循環,併爲此瘋狂。忘了LINQ中的這種方法! – gog