检查空或空List <string>

Jon*_*ell 47 c# list

我有一个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)

我个人认为这不那么冗长,也更容易阅读.您现在可以安全地访问任何集合,而无需进行空检查.

  • 我们可以使用`myList?.Count()> 0`或`myList?Length> 0`或`myList?.Any()`? (6认同)
  • 空条件用法需要固定为“if (!(myList?.Any() ?? false))”之类的内容,以克服“无法隐式转换 bool 类型?”的问题。布尔`错误 (6认同)
  • 比较 `if (!list?.Any() ?? false) {}` (3 个运算符)和 `if (list?.Any() != true) {}` (2 个运算符),我喜欢后者。 (3认同)

mec*_*ech 44

对于没有保证列表为null的任何人,您可以使用空条件运算符在单个条件语句中安全地检查空列表和空列表:

if (list?.Any() != true)
{
    // Handle null or empty list
}
Run Code Online (Sandbox Code Playgroud)


Ami*_*oki 20

结帐L-Four的答案.

答案效率较低:

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的答案中提到的那样,短路比列表中元素的线性计数更快.

  • 当列表为null时,这将抛出异常 (47认同)
  • 不是很好的答案...如果您知道列表是实例化的,请使用它 (4认同)

小智 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)

  • 为什么不只是`return source!= null && source.Any();`? (6认同)
  • 你的方法名是`AnyOrNotNull`,但你的比较是'AND`,我认为正确的名字是'AnyAndNotNull`. (6认同)
  • 我想知道为什么这样的东西没有内置,就像String.IsNullOrEmpty(string str) (3认同)

小智 10

if (myList?.Any() == true) 
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

我发现这是最方便的方法。'== true' 检查 '?.Any() 隐含的可空布尔值

  • 对于任何感兴趣的人:`==true`部分是必要的,因为`myList?.Any()`的结果是`bool?`类型,不能通过`if`语句正确检查。 (6认同)

Mat*_*ish 7

一种简单的组合myList == null || myList.Count == 0方法是使用空合并运算符??

if ((myList?.Count ?? 0) == 0) {
    //My list is null or empty
}
Run Code Online (Sandbox Code Playgroud)


Kim*_*ann 7

扩展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)


Luc*_*esi 6

假设列表从不为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.


Bas*_*sin 6

我想知道没有人建议为 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)