在循环之前检查空Enumerable

时间:2012-01-08 20:00:52

标签: c# ienumerable

我发现自己一遍又一遍地写下以下内容:

if (myEnumerable != null) {
    foreach (var element in myEnumerable) {
        DoSomething(element);
    }
}

每次想要枚举时检查NULL都很乏味,有没有更好的方法?例如,有没有办法覆盖枚举器以返回“Enumerable.Empty”而不是NULL?

4 个答案:

答案 0 :(得分:8)

您可以使用null-coalescing operator

foreach (var element in myEnumerable ?? Enumerable.Empty<Foo>()) {
    DoSomething(element);
}

但更好的方法是确保无论从哪里获取此IEnumerable<T>,都不会返回null,这是在.NET中使用枚举的传统方法。

答案 1 :(得分:6)

好吧,理想情况下设计你的代码,使不能为空。或者,创建一个扩展方法:

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

然后:

foreach (var element in myEnumerable.EmptyIfNull())
    DoSomething(element);
}

这与Darin的方法非常相似,但将空合并运算符移动到扩展方法中。

答案 2 :(得分:1)

扩展方法:

public static EnumerableExtensions
{
  public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> enumerable)
  {
    return enumerable ?? Enumerable.Empty<T>();
  }
}

然后你可以做

foreach (var element in myEnumerable.EmptyIfNull())
{
  DoSomething(element);
}

答案 3 :(得分:0)

不幸的是,检查null是生活中的事实......但它可以更容易。我编写了一个名为ValidWithItems的扩展来检查null以及在不为null时进行divining,实际枚举的是项目。

public static class EnumerableExtensions
{

    /// <summary>Does two checks, if not null and if it has items.</summary>
    /// <returns>True if it is not null and has at least 1 item.</returns>
    public static bool ValidWithItems<T>( this IEnumerable<T> target )
    {
        return ((target != null) && (target.Any()));
    }
}