循环之前正在检查空的Enumerable
本文关键字:Enumerable 检查 循环 | 更新日期: 2023-09-27 18:19:55
我发现自己一遍又一遍地写以下内容:
if (myEnumerable != null) {
foreach (var element in myEnumerable) {
DoSomething(element);
}
}
每次我想枚举时都要检查NULL,这很乏味,有更好的方法吗?例如,有没有一种方法可以重写枚举器以返回"Enumerable.Empty"而不是NULL?
您可以使用空合并运算符:
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()));
}
}