C# IEnumerable<;类型>;不包含';包含';

C# IEnumerable<;类型>;不包含';包含';,c#,.net,linq,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; } } IEnumerable<Values> values; IEnumerable<Ho

我有2个类和2个这些类的IEnumerable列表:

public class Values
{
    public int Value { get; set; }
    public DateTime SomeDate { get; set; }
}

public class Holidays
{
    public DateTime holiday { get; set; }
}

IEnumerable<Values> values;
IEnumerable<Holidays> holidays;
但是,这给了我一个错误,
IEnumerable不包含“Contains”的定义。

已使用s将System.Linq添加到

我相信这与收藏有关,但我不知道是什么。

您可能想要:

是一个LINQ扩展,它(在您的示例中)获取
Holidays
的一个实例,并检查您的枚举是否包含该实例(或
等于给定参数的实例)

您应改为使用:


无法将
假日
对象与
日期时间
进行比较。改用扩展方法:

var query = values.Where(x=> !holidays.Any(e=>e.holiday ==x.someDate));
也可以使用扩展方法:

var query = values.Where(x=> holidays.All(e=>e.holiday !=x.someDate));
使用时,要查找的对象必须与
IEnumerable
的类型
T
匹配。因此,您不能自己搜索
IEnumerable并传递比较

或者,在这种情况下,您也可以使用后跟,尽管在某些情况下可读性可能较低:

var query = values
    .Where(x => !holidays
        .Select(h => h.holiday)
        .Contains(x.someDate));

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

var holidayDates = new HashSet<DateTime>(holidays.Select(h => h.holiday));
var query = values.Where(x => !holidayDates.Contains(x.someDate));
var holidayDates=newhashset(holidays.Select(h=>h.holiday));
var query=values.Where(x=>!holidayDates.Contains(x.someDate));

特别是,如果您有很多假期,此更改将使逐值检查更加有效。

作为一个旁白,现在是开始遵循.NET命名约定的好时机,即使是对于示例也是如此。您的意思是
holidayDates
上的
holidayDates
?请小心
Equals
函数!它可以有多种含义;默认的相等比较器是单向工作的,可以实现
IEquatable
接口,然后可以将新的
EqualityComparer
传递到
Contains
var query = values.Where(x=> holidays.All(e=>e.holiday !=x.someDate));
var query = values
    .Where(x => !holidays
        .Select(h => h.holiday)
        .Contains(x.someDate));
var holidayDates = new HashSet<DateTime>(holidays.Select(h => h.holiday));
var query = values.Where(x => !holidayDates.Contains(x.someDate));