【问题标题】:Why check whether List<T>.Count <= 0?为什么要检查 List<T>.Count <= 0 是否?
【发布时间】:2016-08-04 08:49:20
【问题描述】:

我在很多代码sn-ps中看到,下面这个条件是用来检查一个列表是否为空的:

List<string> someList = someFunctionThatPopulatesAList();
if (someList == null || someList.Count <= 0)
    return;

我想知道 - 为什么不使用以下条件:

if (someList == null || someList.Count == 0)
    return;

有没有List&lt;T&gt;.Count为负数的情况?

【问题讨论】:

  • 不,没有。你说的对。没有必要使用&lt;=
  • 或者更好的List.Any()
  • 我从未见过使用 someList.Count &lt;= 0 的代码,我同意这毫无意义。
  • @Negorath - 不,它没有。 Count 定义为 O(1) 操作。无需迭代即可获得。

标签: c# .net list comparison-operators empty-list


【解决方案1】:

你可以简单地尝试使用 Any() 之类的

if ((someList!= null) && (!someList.Any())) {

}

请注意,如果列表使用 IEnumerable&lt;T&gt; 并且您想使用 LINQ 选项,则可以使用它。

是否存在 List.Count 为负数的情况?

不,不是。实际上,每当您使用 Countlength 之类的操作时,都会返回一个有符号整数,因此它更像是一种实现来检查您是否正在实现它以检查它是否为正结果。(但是从技术上讲你不需要做那个检查。它更像是一个想法实现。

【讨论】:

  • 不,他不能,他仍然需要空检查,any 只替换计数检查,否则它会抛出空
  • 但是如果 someList 是方法的返回值,您仍然可能需要检查它是否不为空
【解决方案2】:

是的,你是对的,没有必要使用它。

您还可以使用@Rahul 建议的Any() 扩展方法。 但是因为您正在检查List&lt;T&gt;,是否建议使用Count(),它会稍微快一些,因为大小是已知的。

  • 如果您使用的是列表,请使用 Count,因为它知道它的大小。
  • 对数组使用长度
  • 如果您只有一个 IEnumerable,我会使用 .Any() 而不是 .Count(),因为它会更快,因为它会在检查一项后停止。

参考 - List<T> Any or Count?

【讨论】:

    【解决方案3】:

    正如其他人所说:使用Any() 是一个很好的解决方案。

    Length == 0相比,使用Length时使用Length &lt;= 0更好有两个不同的方面。

    1. 重用代码更安全。代码可能会更改为使用标准 .net List 实现以外的其他列表类,并且其他列表类在某些情况下可能会为 Length() 返回负值。在我看来,创建这样一个类将是一个非常糟糕的主意,但有时人们会选择遵循坏主意,所以安全总比后悔好。

    2. 在使用代码分析工具时,这将使代码分析工具知道Length 具有正值,并且可以提高该工具对您的代码进行有意义分析的能力。

    【讨论】:

      【解决方案4】:

      空条件运算符 即使是最新的 .NET 开发人员也可能熟悉 NullReferenceException。这是一个异常,几乎总是表明存在错误,因为开发人员在调用(null)对象上的成员之前没有执行足够的 null 检查。

      if(someList?.Any()){
       //Something
      }
      

      【讨论】:

      • 这在当前形式下不起作用,对我来说不是任何方式。需要 ----- someList?.Any() != true
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多