我需要一点帮助来简化LINQ查询.条件如下:
bool IsValid(string expression)给定序列的每个元素.IsValid所有元素都为真,则返回true.IsValid任何元素为false,则返回false.false.我想出的问题是
try
{
(sequence.DefaultIfEmpty().Where(item => !IsValid(item).Count() == 0)
}
catch (ArgumentNullException)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
关键是IsValid(null)抛出一个ArgumentNullException被catch块捕获的东西.但是,我认为这太棘手了.有什么办法可以简化方法而不依赖于这个事实吗?
为什么不:
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)
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |