如何使用Linq查找列出的日期而不是另一个日期

时间:2014-02-05 22:27:01

标签: c# linq

我有两个列表对象:一个描述轮班列表,另一个描述病假列表。

我要做的是比较两个清单并返回一个结果,该结果只列出病假清单,其中病假日期不在班次清单中。

我已经编写了这段代码,但它没有返回列表:

var nonAvailableDates =availability
   .Where(a=>! shiftDay.Any(b=>b.ShiftDate.Date == a.StartPeriod.Date)).ToList();

有人可以告诉我哪里出错了吗?

由于

1 个答案:

答案 0 :(得分:0)

您正在寻找设置差异操作,它是LINQ中的Except()方法(将为您提供第一个集合中不在秒中的所有元素):

List<DateTime> shifts = new List<DateTime>{ DateTime.Parse("1/1/2014"), DateTime.Parse("1/2/2014")};
List<DateTime> sickLeaves = new List<DateTime>{DateTime.Parse("1/1/2014"), DateTime.Parse("1/3/2014")};

var sickLeavesThatAreNotAlsoShifts = sickLeaves.Except(shifts); // contains only 1/3/2014
编辑:给这一点。我们基本上是加入,然后采取没有任何匹配的项目。

var sickLeavesNotInShifts = from sickLeave in sickLeaves
                            join shift in shifts on sickLeave.StartPeriod equals shift.ShiftDate into joinedShifts
                            from js in joinedShifts.DefaultIfEmpty()
                            where js == null
                            select sickLeave;

注意:这比嵌套搜索更渐进,因为join在内部实现了一个散列连接,即O(m + n)(m和n是两个集合的计数)。