为什么要检查List<T>.Count是否小于等于0?

3

我看到很多代码片段中使用以下条件来检查一个列表是否为空:

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

我在想,为什么不使用以下条件:

if (someList == null || someList.Count == 0)
    return;
< p>在什么情况下 List<T>.Count 会是负数?< /p>

6
没有,你说得对。使用<=并不是必要的。 - mostafa8026
6
或者更好的是 List<T>.Any()。 - hendryanw
1
我从未见过使用 someList.Count <= 0 的代码,我同意这根本没有任何意义。 - Toxantron
4
不,它不需要迭代。 Count被定义为一个O(1)的操作,可以在没有迭代的情况下获得。 - Damien_The_Unbeliever
1
这个回答解决了您的问题吗? [为什么List <T> .Count是有符号整数? List <T> .Count会变成负数吗?] (https://dev59.com/UsLra4cB1Zd3GeqPEjnx) - Lance U. Matthews
显示剩余5条评论
4个回答

5

您可以尝试使用Any(),如下所示:

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

}

请注意,如果列表使用 IEnumerable<T> 并且您想使用 LINQ 选项,则可以使用它。
“List.Count” 有否为负数的情况?
不会。实际上,每当您使用类似于 Countlength 的操作时,都会返回一个带符号的整数,因此更像是一种实现来检查您是否正在实现它以检查它是否为正结果。(但是从技术上讲,您不需要进行该检查。这更像是一种理念实现。

不行,他仍然需要进行空值检查,any 只是替换了计数检查,否则它会在空值上抛出异常。 - Ronan Thibaudau
但是,如果someList是从方法中返回的值,则仍然需要检查它是否为null。 - auburg

1

是的,你说得对,不必使用那个。

你也可以像@Rahul建议的那样使用Any()扩展方法。 但是因为你正在检查一个List<T>,建议使用Count(),它会稍微快一点,因为大小已知。

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

参考 - List<T> Any or Count?


1

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

使用 Length <= 0 而不是 Length == 0,有两个独立的方面更好。

  1. 在重用代码时更安全。代码可能会更改以使用标准 .net List<> 实现之外的其他列表类,而那些列表类在某些情况下可能会返回 Length() 的负值。在我看来,创建这样的类是一个非常糟糕的想法,但有时人们选择追随糟糕的想法,所以宁愿安全也不要抱歉。

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


0

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

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

以当前的形式,那行不通,至少对我来说是这样。需要改成----- someList?.Any() != true。 - TSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接