2013-08-02 74 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