我有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,你要寻找的对象必须的类型相匹配T的IEnumerable<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)
作为其他人已经建议的替代方案:
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)
特别是,如果您有很多假期,此更改将使每个值检查更有效.
Contains是一个LINQ扩展,它接受(在您的情况下)一个实例,Holidays并检查您的枚举是否包含该实例(或Equals给定参数的实例).
您应该使用Any:
var query = values.Where(x=> !holidays.Any(h => h.holiday == x.someDate));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12131 次 |
| 最近记录: |