我发现自己一遍又一遍地写下以下内容:
if (myEnumerable != null) {
foreach (var element in myEnumerable) {
DoSomething(element);
}
}
每次想要枚举时检查NULL都很乏味,有没有更好的方法?例如,有没有办法覆盖枚举器以返回“Enumerable.Empty”而不是NULL?
答案 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()));
}
}