繁体   English   中英

IEnumerable<type> 不包含“包含”的定义

[英]IEnumerable<type> does not contain a definition of 'Contains'

我有 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;

接下来,我试图选择那些“值”,其中“someDate”不在“假期”中

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

但是,这给了我IEnumerable<Holidays> does not contain a definition of 'Contains'的错误。

System.Linq 已添加到using

我相信这与收藏品有关,但我无法弄清楚是什么。

当您使用Contains ,您要查找的对象必须与IEnumerable<T>的类型T匹配。 因此,您不能在IEnumerable<A>搜索B类型的包含对象,因为没有比较两者的隐式方法。

正如其他答案中提到的,使用Any并自己传递比较。

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

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));

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

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

您应该改用Any

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

你可能想要Any()

var query = values.Where(v => !holidays.Any(h => h.holiday == v.someDate));

您不能将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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM