我一直在遇到这样的情况,我觉得我缺少一个LINQ扩展方法,可以有效地检查集合中是否没有匹配指定的谓词。有Any
和All
,但如果我使用以下代码:
if (Objects.All(u => u.Distance <= 0))
如果集合中的所有对象都在0码或更远的距离,则返回true。
if (Objects.Any(u => u.Distance <= 0))
如果集合中至少有一个对象距离我不到0码,则返回true。
到目前为止,这两种方法都很有意义,而且它们的语法也很有意义。现在,如果我想检查是否没有距离为0或更小的对象,我必须将All
方法中的谓词反转为>= 0
而不是<= 0
或调用!All()
,这在某些情况下导致代码非常难以理解。
有没有方法可以有效地Collection.None(u => u.Distance <= 0)
来检查集合中是否有0码或更短距离的对象?它的语法糖不仅仅是一个实际的问题,但我只是觉得它缺失了。
答案 0 :(得分:32)
None
与!Any
相同,因此您可以按如下方式定义自己的扩展方法:
public static class EnumerableExtensions
{
public static bool None<TSource>(this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
return !source.Any(predicate);
}
}
答案 1 :(得分:5)
您可以自己编写Extension Method
:
public static bool None(this IEnumerable<T> collection, Func<T, bool> predicate)
{
return collection.All(p=>predicate(p)==false);
}
或IQueryable<T>
以及
public static bool None(this IQueryable<T> collection, Expression<Func<TSource, bool>> predicate)
{
return collection.All(p=> predicate(p)==false);
}
答案 2 :(得分:0)
甚至更短的版本
static class LinqExtensions
{
public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) => !source.Any(predicate);
}