在循环之前检查空Enumerable

des*_*lsj 2 c# ienumerable

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

if (myEnumerable != null) {
    foreach (var element in myEnumerable) {
        DoSomething(element);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 8

您可以使用null-coalescing运算符:

foreach (var element in myEnumerable ?? Enumerable.Empty<Foo>()) {
    DoSomething(element);
}
Run Code Online (Sandbox Code Playgroud)

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

  • @desautelsj,不,对我来说,更进一步的步骤是修复返回此枚举的代码,以便它永远不会返回null. (2认同)

Jon*_*eet 6

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

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

然后:

foreach (var element in myEnumerable.EmptyIfNull())
    DoSomething(element);
}
Run Code Online (Sandbox Code Playgroud)

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