IEnumerable <type>不包含'Contains'的定义

时间:2016-03-22 16:07:09

标签: c# .net linq

我有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已添加到使用中。

我相信这必须对收藏品做些什么,但我无法弄清楚是什么。

5 个答案:

答案 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)

您无法将Holiday对象与DateTime进行比较。请改用Any扩展方法:

var query = values.Where(x=> !holidays.Any(e=>e.holiday ==x.someDate));

或者您也可以使用All扩展方法:

var query = values.Where(x=> holidays.All(e=>e.holiday !=x.someDate));