简化LINQ查询

Use*_*ser 2 linq

我需要一点帮助来简化LINQ查询.条件如下:

  • 我需要应用bool IsValid(string expression)给定序列的每个元素.
  • 如果IsValid所有元素都为真,则返回true.
  • 如果IsValid任何元素为false,则返回false.
  • 如果序列为null或为空,则返回false.

我想出的问题是

try
{
    (sequence.DefaultIfEmpty().Where(item => !IsValid(item).Count() == 0)
}
catch (ArgumentNullException)
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

关键是IsValid(null)抛出一个ArgumentNullExceptioncatch块捕获的东西.但是,我认为这太棘手了.有什么办法可以简化方法而不依赖于这个事实吗?

Bro*_*ass 6

为什么不:

return sequence.Any() && sequence.All(item => IsValid(item));
Run Code Online (Sandbox Code Playgroud)

如果你担心sequence.Any()会导致Resharper警告的单独检查(这可以保证你只能像网络,数据库等那样迭代一次的任何序列),你可以写一个通用的扩展方法来进行检查并迭代序列只有一次:

public static bool NotEmptyAndValid<T>(this IEnumerable<T> source, 
                                       Func<T, bool> predicate)
{
    bool hasItem = false;
    foreach(var item in source)
    {
        hasItem = true;
        if(!predicate(item))
            return false;
    }
    return hasItem;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

return sequence.NotEmptyAndValid( x => IsValid(x));
Run Code Online (Sandbox Code Playgroud)