我有2个类和2个IEnumerable列表:
public class Values
{
public int value {get;set;}
public DateTime someDate {get;set;}
}
public class Holidays
{
public DateTime holiday {get;set;}
}
IEnumberable<Values> values;
IEnumberable<Holidays> holidays;
接下来,我试图选择'someDate'不在'假日'中的'值'
var query = values.Where(x=> !holidays.Contains(x.someDate));
然而,这给了我IEenumerable的错误,其中不包含'Contains'的定义。
System.Linq已添加到使用中。
我相信这必须对收藏品做些什么,但我无法弄清楚是什么。
答案 0 :(得分:15)
使用Contains
时,您要查找的对象必须与T
的{{1}}类型匹配。因此,您无法在IEnumerable<T>
中搜索类型为IEnumerable<A>
的包含对象,因为没有隐式方法来比较这两者。
如其他答案所述,请使用Any
并自行传递比较。
或者,这也是您可以使用Select
后跟Contains
的情况,尽管在某些情况下这可能不太可读:
B
答案 1 :(得分:7)
作为其他人已经建议的替代方案:
var holidayDates = new HashSet<DateTime>(holidays.Select(h => h.holiday));
var query = values.Where(x => !holidayDates.Contains(x.someDate));
特别是,如果您有很多假期,此更改将使每个值检查更有效。
答案 2 :(得分:5)
Contains
是一个LINQ扩展,它接受(在您的情况下)Holidays
的实例,并检查您的枚举是否包含该实例(或Equals
给定参数的实例)。
您应该使用Any
代替:
var query = values.Where(x=> !holidays.Any(h => h.holiday == x.someDate));
答案 3 :(得分:4)
您可能需要Any():
var query = values.Where(v => !holidays.Any(h => h.holiday == v.someDate));
答案 4 :(得分:1)