在C#中,做包含null case的Any()最干净的方法是什么?

时间:2014-06-25 21:09:54

标签: c# linq

我在C#中有以下代码:

 if (this.Trucks.Any() || this.Cars.Any())
 {
      return true;
 }
 return false;

但我刚刚意识到有时这些数组中的一个或任何一个是null,所以在我的情况下,我想null只返回false(而不是抛出异常)。

我可以像这样添加前期空检查:

 if ((this.Trucks != null && this.Trucks.Any()) || 
    (this.Cars != null && this.Cars.Any()))
 {
    return true;
 }
  return false;
 }

但想看看是否有更清洁的方式

4 个答案:

答案 0 :(得分:4)

如果你想将空序列作为空序列进行交换,我会创建一个扩展方法:

public static class Seq
{
    public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> seq)
    {
        return seq ?? Enumerable.Empty<T>();
    }
}

return this.Trucks.EmptyIfNull().Any() || this.Cars.EmptyIfNull().Any()

如果您不想使用处理空值的扩展方法,则可以删除this修饰符并使用

return Seq.EmptyIfNull(this.Trucks).Any() || Seq.EmptyIfNull(this.Cars).Any()

答案 1 :(得分:4)

我建议你尽可能地保持非空契约(空对象模式)。这意味着您可能会在构造函数空数组(Enumerable.Empty<T>()中初始化IEnumerable - 如果是数组add .ToArray())。空检查的问题通常是在代码上传播和相乘 - 代码(和单元测试)的复杂性不必要地增加。忘记在x个地方检查空值比忘记在一个地方初始化空对象更容易。您还可以使用Code contracts库在运行时检查“合同”。事实上,“null”的发明者称这是十亿美元的错误:"Null References: The Billion Dollar Mistake"

答案 2 :(得分:2)

制作自己的实施:

public static Class StaticHelpers
{
    public static bool AnyEx<T>(this IEnumerable<T> enumerable)
    {
        if (enumerable == null) return false;

        return enumerable.Any();
    }
}

像这样使用:

if (this.Trucks.AnyEx() || this.Cars.AnyEx())
{
    return true;
}
return false;

答案 3 :(得分:1)

如何在主if条件下检查它们:

if ((this.Trucks != null && this.Trucks.Any()) || 
    (this.Cars != null && this.Cars.Any()))
{
  return true;
}
return false;

这可以改写成一条长行:

return ((this.Trucks != null && this.Trucks.Any()) || 
        (this.Cars != null && this.Cars.Any()));