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

Pra*_*dar 9 .net c# 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;
Run Code Online (Sandbox Code Playgroud)

接下来,我试图选择'someDate'不在'假期'中的'值'

var query = values.Where(x=> !holidays.Contains(x.someDate));
Run Code Online (Sandbox Code Playgroud)

但是,这给了我IEenumerable的错误,它不包含'Contains'的定义.

System.Linq已添加到使用中.

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

Dav*_*vid 17

当你使用Contains,你要寻找的对象必须的类型相匹配TIEnumerable<T>.因此,您无法搜索IEnumerable<A>类型的包含对象,B因为没有隐式方法来比较这两者.

如其他答案所述,请自行使用Any并传递比较.

或者,这也是你可以使用a Select后跟的情况Contains,尽管在某些情况下这可能不太可读:

var query = values
    .Where(x => !holidays
        .Select(h => h.holiday)
        .Contains(x.someDate));
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

作为其他人已经建议的替代方案:

var holidayDates = new HashSet<DateTime>(holidays.Select(h => h.holiday));
var query = values.Where(x => !holidayDates.Contains(x.someDate));
Run Code Online (Sandbox Code Playgroud)

特别是,如果您有很多假期,此更改将使每个值检查更有效.


Ren*_*ogt 5

Contains是一个LINQ扩展,它接受(在您的情况下)一个实例,Holidays并检查您的枚举是否包含该实例(或Equals给定参数的实例).

您应该使用Any:

var query = values.Where(x=> !holidays.Any(h => h.holiday == x.someDate));
Run Code Online (Sandbox Code Playgroud)