我有两个列表对象:一个描述轮班列表,另一个描述病假列表。
我要做的是比较两个清单并返回一个结果,该结果只列出病假清单,其中病假日期不在班次清单中。
我已经编写了这段代码,但它没有返回列表:
var nonAvailableDates =availability
.Where(a=>! shiftDay.Any(b=>b.ShiftDate.Date == a.StartPeriod.Date)).ToList();
有人可以告诉我哪里出错了吗?
由于
答案 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是两个集合的计数)。