我有一个List,有时它是空的或null.我希望能够检查它是否包含任何List项,如果没有,则将对象添加到List.
// I have a list, sometimes it doesn't have any data added to it
var myList = new List<object>();
// Expression is always false
if (myList == null)
Console.WriteLine("List is never null");
if (myList[0] == null)
myList.Add("new item");
//Errors encountered: Index was out of range. Must be non-negative and less than the size of the collection.
// Inner Exception says "null"
Run Code Online (Sandbox Code Playgroud)
L-F*_*our 64
请尝试以下代码:
if ( (myList!= null) && (!myList.Any()) )
{
// Add new item
myList.Add("new item");
}
Run Code Online (Sandbox Code Playgroud)
编辑迟到,因为对于这些检查我现在想使用以下解决方案.首先,添加一个名为Safe()的小型可重用扩展方法:
public static class IEnumerableExtension
{
public static IEnumerable<T> Safe<T>(this IEnumerable<T> source)
{
if (source == null)
{
yield break;
}
foreach (var item in source)
{
yield return item;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以这样做:
if (!myList.Safe().Any())
{
// Add new item
myList.Add("new item");
}
Run Code Online (Sandbox Code Playgroud)
我个人认为这不那么冗长,也更容易阅读.您现在可以安全地访问任何集合,而无需进行空检查.
mec*_*ech 44
对于没有保证列表不为null的任何人,您可以使用空条件运算符在单个条件语句中安全地检查空列表和空列表:
if (list?.Any() != true)
{
// Handle null or empty list
}
Run Code Online (Sandbox Code Playgroud)
Ami*_*oki 20
答案效率较低:
if(myList.Count == 0){
// nothing is there. Add here
}
Run Code Online (Sandbox Code Playgroud)
基本上new List<T>不会,null但没有元素.正如评论中所指出的,如果列表未实例化,上述内容将抛出异常.但至于问题中的片段,它被实例化,上面的工作就好了.
如果你需要检查null,那么它将是:
if(myList != null && myList.Count == 0){
// The list is empty. Add something here
}
Run Code Online (Sandbox Code Playgroud)
更好的是使用!myList.Any()并且如前面提到的L-Four的答案中提到的那样,短路比列表中元素的线性计数更快.
小智 13
那么使用扩展方法呢?
public static bool AnyOrNotNull<T>(this IEnumerable<T> source)
{
if (source != null && source.Any())
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
小智 10
if (myList?.Any() == true)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我发现这是最方便的方法。'== true' 检查 '?.Any() 隐含的可空布尔值
一种简单的组合myList == null || myList.Count == 0方法是使用空合并运算符??:
if ((myList?.Count ?? 0) == 0) {
//My list is null or empty
}
Run Code Online (Sandbox Code Playgroud)
扩展IsNullOrEmpty()方法是一种非常优雅且易于阅读的实现方式,因此我决定使用它。但是,您也可以在没有扩展方法的情况下实现相同的目标。
假设我们有一个名为listtype 的对象List<T>(例如List<string>)。如果你想知道列表中是否有 items,你可以说:
list?.Count > 0 // List<T> has items
Run Code Online (Sandbox Code Playgroud)
false如果列表本身是一个null对象,则这将返回一个空列表,true否则也会返回。
因此,如果您想检查列表是否没有任何项目,您唯一需要做的就是反转上面的表达式:
!(list?.Count > 0) // List<T> is null or empty
Run Code Online (Sandbox Code Playgroud)
true如果列表本身是一个null对象,则这将返回一个空列表,false否则也会返回。正是您对IsNullOrEmpty评估的期望。只是有点神秘!
作为List<T>Implements IEnumerable<T>,您可以实现不太具体的相同内容,但这可能会使评估速度变慢:
list?.Any() != true // IEnumerable<T> is null or empty
Run Code Online (Sandbox Code Playgroud)
假设列表从不为null,则以下代码检查列表是否为空,如果为空则添加新元素:
if (!myList.Any())
{
myList.Add("new item");
}
Run Code Online (Sandbox Code Playgroud)
如果列表可能为null,则必须在Any()条件之前添加空检查:
if (myList != null && !myList.Any())
{
myList.Add("new item");
}
Run Code Online (Sandbox Code Playgroud)
在我看来,使用Any()而不是Count == 0更好,因为它更好地表达了检查列表是否有任何元素或是否为空的意图.但是,考虑到每种方法的性能,使用Any()通常比慢Count.
我想知道没有人建议为 OP 的案例创建自己的扩展方法更具可读性的名称。
public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
if (source == null)
{
return true;
}
return source.Any() == false;
}
Run Code Online (Sandbox Code Playgroud)