检查空或空List <string> </string>

时间:2014-06-24 15:00:51

标签: 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"

24 个答案:

答案 0 :(得分:52)

请尝试以下代码:

 if ( (myList!= null) && (!myList.Any()) )
 {
     // Add new item
     myList.Add("new item"); 
 }

编辑后期,因为对于这些检查,我现在想使用以下解决方案。 首先,添加一个名为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;
        }
    }
}

然后,你可以这样做:

 if (!myList.Safe().Any())
 {
      // Add new item
      myList.Add("new item"); 
 }

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

答案 1 :(得分:35)

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

Should Be Equal      ${count}      2

答案 2 :(得分:19)

结帐L-Four's回答。

效率低下的答案:

if(myList.Count == 0){
    // nothing is there. Add here
}

基本上new List<T>不会是null,但没有元素。正如评论中所指出的,如果列表未实例化,上述内容将抛出异常。但至于问题中的片段,在实例化的地方,上面的工作会很好。

如果你需要检查null,那么它将是:

if(myList != null && myList.Count == 0){
  // The list is empty. Add something here
}

更好的是使用!myList.Any()并且正如前面提到的L-Four的回答中提到的那样,短路比列表中元素的线性计数更快。

答案 3 :(得分:12)

使用扩展方法怎么样?

public static bool AnyOrNotNull<T>(this IEnumerable<T> source)
{
  if (source != null && source.Any())
    return true;
  else
    return false;
}

答案 4 :(得分:6)

假设列表永远不为null,以下代码检查列表是否为空,如果为空则添加新元素:

if (!myList.Any())
{
    myList.Add("new item");
}

如果列表可能为null,则必须在Any()条件之前添加空检查:

if (myList != null && !myList.Any())
{
    myList.Add("new item");
}

在我看来,使用Any()代替Count == 0是更可取的,因为它更好地表达了检查列表是否包含任何元素或为空的意图。 但是,考虑到每种方法的效果,使用Any()通常slower而不是Count

答案 5 :(得分:3)

您的列表没有商品,这就是为什么访问不存在的第0个商品

myList[0] == null

throws 索引超出范围异常;当您想要访问第n个项目检查

  if (myList.Count > n)
    DoSomething(myList[n])

在你的情况下

  if (myList.Count > 0) // <- You can safely get 0-th item
    if (myList[0] == null) 
      myList.Add("new item");

答案 6 :(得分:3)

如果您想要一个同时检查null和empty的单行条件,可以使用

if (list == null ? true : (!list.Any()))

这将适用于旧条件运算符不可用的旧框架版本。

答案 7 :(得分:2)

List中的

c#具有Count属性。它可以像这样使用:

if(myList == null) // Checks if list is null
    // Wasn't initialized
else if(myList.Count == 0) // Checks if the list is empty
    myList.Add("new item");
else // List is valid and has something in it
    // You could access the element in the list if you wanted

答案 8 :(得分:2)

myList[0]获取列表中的第一项。由于列表为空,因此无法获取项目,而是获得IndexOutOfRangeException

正如其他答案所示,为了检查列表是否为空,您需要获取列表中的元素数量(myList.Count)或使用将返回的LINQ方法.Any()如果列表中有任何元素,则为true。

答案 9 :(得分:1)

if (myList?.Any() == true) 
{
   ...
}

我发现这是最方便的方式。 &#39; == true&#39;检查&#39;?暗示的可空bool的值.Any()

答案 10 :(得分:1)

这里的大多数答案都集中在如何检查一个集合是否为空或空值上,正如他们所证明的那样,这很简单。

像这里的许多人一样,我也想知道为什么Microsoft本身不提供已经为String类型(String.IsNullOrEmpty())提供的这种基本功能?然后我遇到了这个guideline from Microsoft,上面写着:

X请勿从集合属性或返回集合的方法中返回空值。而是返回一个空集合或一个空数组。

一般规则是null和空(0个项目)集合或数组 应该一视同仁。

因此,理想的情况是,如果您遵循Microsoft的此准则,则永远不应该有一个为null的集合。这将帮助您删除不必要的空检查,最终使您的代码更具可读性。在这种情况下,只需要检查一下myList.Any()即可确定列表中是否存在任何元素。

希望这种解释对将来会遇到相同问题的人有所帮助,并且想知道为什么没有这样的功能来检查集合是否为空或空。

答案 11 :(得分:1)

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

if ((myList?.Count ?? 0) == 0) {
    //My list is null or empty
}

答案 12 :(得分:1)

我想知道没有人建议为OP的情况创建自己的扩展方法更易读的名称。

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        return true;
    }

    return source.Any() == false;
}

答案 13 :(得分:1)

尝试并使用:

if(myList.Any())
{

}

注意:这个assmumes myList不是null。

答案 14 :(得分:0)

您可以在c#

中使用List的Count属性

请找到下面的代码,它在一个条件中检查列表为空和空

if(myList == null || myList.Count == 0)
{
    //Do Something 
}

答案 15 :(得分:0)

由于您用'new'初始化了myList,所以列表本身永远不会为空。

但是可以用'null'值填充。

在这种情况下,.Count > 0.Any()将为true。您可以使用.All(s => s == null)

进行检查
var myList = new List<object>();
if (myList.Any() || myList.All(s => s == null))

答案 16 :(得分:0)

我们可以添加扩展名以创建一个空列表

    public static IEnumerable<T> Nullable<T>(this IEnumerable<T> obj)
    {
        if (obj == null)
            return new List<T>();
        else
            return obj;
    }

并像这样使用

foreach (model in models.Nullable())
{
    ....
}

答案 17 :(得分:0)

我们可以使用Extension方法进行如下验证。我将它们用于我的所有项目。

  var myList = new List<string>();
  if(!myList.HasValue())
  {
     Console.WriteLine("List has value(s)");              
  }

  if(!myList.HasValue())
  {
     Console.WriteLine("List is either null or empty");           
  }

  if(myList.HasValue())
  {
      if (!myList[0].HasValue()) 
      {
          myList.Add("new item"); 
      }
  }




/// <summary>
/// This Method will return True if List is Not Null and it's items count>0       
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <returns>Bool</returns>
public static bool HasValue<T>(this IEnumerable<T> items)
{
    if (items != null)
    {
        if (items.Count() > 0)
        {
            return true;
        }
    }
    return false;
}


/// <summary>
/// This Method will return True if List is Not Null and it's items count>0       
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <returns></returns>
public static bool HasValue<T>(this List<T> items)
{
    if (items != null)
    {
        if (items.Count() > 0)
        {
            return true;
        }
    }
    return false;
}


/// <summary>
///  This method returns true if string not null and not empty  
/// </summary>
/// <param name="ObjectValue"></param>
/// <returns>bool</returns>
public static bool HasValue(this string ObjectValue)
{
    if (ObjectValue != null)
    {
        if ((!string.IsNullOrEmpty(ObjectValue)) && (!string.IsNullOrWhiteSpace(ObjectValue)))
        {
            return true;
        }
    }
    return false;
}

答案 18 :(得分:0)

这能够解决您的问题 `if(list.Length> 0){

}`

答案 19 :(得分:0)

我个人为 IEnumerable 类创建了一个扩展方法,我称之为 IsNullOrEmpty()。因为它适用于 IEnumerable 的所有实现,所以它适用于 List,也适用于 String、IReadOnlyList 等。

我的实现很简单:

public static class ExtensionMethods
{
    public static bool IsNullOrEmpty(this IEnumerable enumerable)
    {
        if (enumerable is null) return true;

        foreach (var element in enumerable)
        {
            //If we make it here, it means there are elements, and we return false
            return false;
        }

        return true;
    }
}

然后我可以在列表上使用该方法,如下所示:

var myList = new List<object>();

if (myList.IsNullOrEmpty())
{
    //Do stuff
}

答案 20 :(得分:0)

if(myList.IsNullOrEmpty()) 只是正确的方法。

答案 21 :(得分:0)

我只是想在这里添加一个答案,因为这是 Google 上检查 List 是否为空或为空的热门话题。对我来说,.Any 无法识别。如果你想在不创建扩展方法的情况下进行检查,你可以这样做,这很简单:

//Check that list is NOT null or empty.
if (myList != null && myList.Count > 0)
{
    //then proceed to do something, no issues here.
}

//Check if list is null or empty.
if (myList == null || myList.Count == 0)
{
    //error handling here for null or empty list
}

//checking with if/else-if/else
if (myList == null)
{
    //null handling
}
else if(myList.Count == 0)
{
    //handle zero count
}
else
{
    //no issues here, proceed
}

如果列表有可能为空,那么您必须先检查是否为空 - 如果您尝试先检查计数并且列表恰好为空,那么它将引发错误。 &&|| 是短路运算符,因此仅在不满足第一个条件时才评估第二个条件。

答案 22 :(得分:0)

您可以添加此 IEnumerable 扩展方法,如果源序列包含任何元素且不为空,则该方法返回 true。否则返回 false。

public static class IEnumerableExtensions
{
    public static bool IsNotNullNorEmpty<T>(this IEnumerable<T> source)
       => source?.Any() ?? false;
}

答案 23 :(得分:0)

您可以通过多种方式检查列表是否为空

1)Checklist 为空,然后检查计数大于零,如下所示:-

if (myList != null && myList.Count > 0)
{
    //List has more than one record.
}

2) 使用如下 LINQ 查询检查清单 null 和计数大于零:-

if (myList?.Any() == true)
{
    //List has more than one record.
}