循环之前正在检查空的Enumerable

本文关键字:Enumerable 检查 循环 | 更新日期: 2023-09-27 18:19:55

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

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

每次我想枚举时都要检查NULL,这很乏味,有更好的方法吗?例如,有没有一种方法可以重写枚举器以返回"Enumerable.Empty"而不是NULL?

循环之前正在检查空的Enumerable

您可以使用空合并运算符:

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

但一个更好的方法是确保无论从何处获取此IEnumerable<T>,都不会返回null,这是在.NET.

中使用可枚举对象的传统方法

理想情况下,设计您的代码,使其不能为null。或者,创建一个扩展方法:

 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的方法非常相似,但将null合并运算符移到了扩展方法中。

一种扩展方法:

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);
}

不幸的是,检查null是生活中的一个事实。。。但这可能更容易。我写了一个名为ValidWithItems的扩展,用于检查是否为null,以及在不为null时判断是否有要枚举的项。

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()));
    }
}