[英]How to use Linq to find dates in listed but not in another
我有两个列表对象:一个描述一个班次列表,另一个描述一个病假列表。
我想做的是比较这两个列表,并返回仅给出病假列表的结果,其中请假日期不在班次列表中。
我已经编写了这段代码,但是没有返回列表:
var nonAvailableDates =availability
.Where(a=>! shiftDay.Any(b=>b.ShiftDate.Date == a.StartPeriod.Date)).ToList();
有人可以告诉我我哪里出问题了吗?
谢谢
您正在寻找集合差异运算,这是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是两个集合的计数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.