Eri*_*Yin 66 c# ienumerable isnullorempty
我知道一般空列表比NULL更喜欢.但我将返回NULL,主要有两个原因
??
之后很容易执行操作以获得返回值.对于字符串,我们有IsNullOrEmpty.有没有C#本身为List或IEnumerable做同样的事情?
Mat*_*nes 68
没有任何东西融入框架,但它是一个非常直接的扩展方法.
/// <summary>
/// Determines whether the collection is null or contains no elements.
/// </summary>
/// <typeparam name="T">The IEnumerable type.</typeparam>
/// <param name="enumerable">The enumerable, which may be null or empty.</param>
/// <returns>
/// <c>true</c> if the IEnumerable is null or empty; otherwise, <c>false</c>.
/// </returns>
public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null)
{
return true;
}
/* If this is a list, use the Count property for efficiency.
* The Count property is O(1) while IEnumerable.Count() is O(N). */
var collection = enumerable as ICollection<T>;
if (collection != null)
{
return collection.Count < 1;
}
return !enumerable.Any();
}
Run Code Online (Sandbox Code Playgroud)
出于性能原因,Daniel Vaughan采取额外的步骤进行ICollection(尽可能).我不会想到的东西.
Teo*_*ite 40
延迟更新:从C#6.0开始,null-propagation运算符可用于表达简洁如下:
if ( list?.Count > 0 ) // For List<T>
if ( array?.Length > 0 ) // For Array<T>
Run Code Online (Sandbox Code Playgroud)
注1: IEnumerable<T>
是必要的,因为以下原因(摘要/引自本文):
IsNotNullOrEmpty
IsNullOrEmpty
如果是儿童成员,则操作员将返回if (!(list?.Count > 0))
.但是如果我们试图得到一个非?? false
成员,比如?.
返回null
[...]的方法,那么编译器将"包装"一个返回值null
.例如,Nullable
将给我们Any()
(这是bool
),而不是Nullable<>
.[...]因为它无法隐式地转换Object?.Any()
为此表达式所以无法使用bool?
注2:作为奖励,该声明也是"线程安全的"(引用该问题的答案):
在多线程上下文中,如果[ enumerable ]可以从另一个线程访问(因为它是一个可访问的字段,或者因为它在暴露给另一个线程的lambda中被关闭),那么每次计算时该值都可能不同[ ieprior null - 检查 ]
Ode*_*ded 24
内置任何东西.
这是一个简单的扩展方法:
public static bool IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
if(enumerable == null)
return true;
return !enumerable.Any();
}
Run Code Online (Sandbox Code Playgroud)