我一直在遇到这样的情况,我觉得我缺少一个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码或更少的距离?它的语法糖不仅仅是一个实际的问题,但我只是觉得它缺失了.
dtb*_*dtb 34
None是一样的!Any,所以您可以定义自己的扩展方法,如下所示:
public static class EnumerableExtensions
{
public static bool None<TSource>(this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
return !source.Any(predicate);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以写自己的Extension Method:
public static bool None(this IEnumerable<T> collection, Func<T, bool> predicate)
{
return collection.All(p=>predicate(p)==false);
}
Run Code Online (Sandbox Code Playgroud)
或者IQueryable<T>也是
public static bool None(this IQueryable<T> collection, Expression<Func<TSource, bool>> predicate)
{
return collection.All(p=> predicate(p)==false);
}
Run Code Online (Sandbox Code Playgroud)