C# IEnumerable<;类型>;不包含';包含';
我有2个类和2个这些类的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
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));