何时检查 List<T> 是否为 null,何时检查是否为 0,何时两者都要检查

3
我将使用ADO.NET实体框架作为例子,经常会有像这样的代码片段:

List<Sole> entity = soleService.All()
    .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20))
    .ToList();

到目前为止,我还没有深入思考这个问题,只是进行了以下检查:

if (entity.Count > 0)

曾经我以为使用 Any()null 的检查已经足够。现在我看到很多人会同时使用这两种检查方式。我该如何确定在特定情况下需要哪种检查?在我经常使用的场景中,if (entity.Count > 0) 是否足够呢?


6
因为性能问题,建议使用 Any() 而非 Count()Count() 需要遍历整个列表,而 Any() 只要找到一个匹配项就会立即停止。 - Viper
2
+1 Viper。此外,Entity Framework 永远不会返回集合的 null - Jens Kloster
@Viper,你的评论应该是答案。 - chridam
2
https://dev59.com/g3VC5IYBdhLWcg3wZwTj - cuongle
8个回答

4

if (entity.Count > 0) 或者 if (entity.Any()) 在你的情况下是相同的。因为你已经从数据库中获取了所有数据,列表已经建立并且您知道它的大小。所以 .Count 属性不会遍历任何内容。

另一方面,如果您没有获取所有数据,请不要调用 .Count() IEnumerable 扩展,因为这将无意义地枚举项目。

请使用:

bool test = soleService.All()
    .Any(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));

if (test)
{
...
}

此外,LINQ扩展方法不会返回null,而是会返回一个空的IEnumerable接口。因此,不要检查是否为null

如果 (entity.Count > 0) 或者 (entity.Any()) 在你的情况下是相同的,那么不是这样的! .Count() 的速度比 Any() 慢! - Maris
3
@Maris .Count() 扩展方法与 IList<T> 的 .Count 属性非常不同。 - ken2k
如果对象是ICollection,则Count()不会枚举项。因此,CountCount()之间的性能影响仅为装箱所用的时间。 - Andy

2

Any()会提供更好的解决方案,因为它在第一次匹配后就停止。

另外

我建议只有在Any()为真时才执行ToList()

这样可以节省微小的性能。

var t = soleService.All()  .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));
if  (t.Any()) entity =t.ToList();

2

当然,一个列表可以是 null 或者空的。如果你尝试使用上述的 LINQ 创建一个 List<Sole> 而且 soleService 可能为 null,那么你将会得到一个 NullReferenceException。所以我会先检查 soleService 是否为 null 或者空的。

List<Sole> entity = null;
// ...
if (soleService != null && soleService.Count > 0)
    entity = soleService.All()
        .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20))
        .ToList();

我希望这能有所帮助。

2
如果你使用了.ToList()方法,那么该列表一定是一个列表。可能为空,但不会是null。
对于大多数容器或可枚举对象,使用.Any()而不是.Count() > 0可以提高性能,因为.Any()只会访问第一个元素(如果有的话)。.Count()需要计算整个容器的数量,即使你只关心它是否为零,也必须遍历到末尾。

2

取决于您的需求。

如果您只想知道任何实体是否与您的谓词匹配,则使用Any(),因为它会在找到第一个匹配实体后立即返回。Count() / Count需要处理所有实体,这通常会慢得多。

此外,与List Count相比,更喜欢使用Linq的Count(),因为它不必在内存中创建完整列表,对于大结果集来说,这可能非常昂贵。


2

entity.Any() - 如果集合中有任何实体,则返回true。entities.Count() == 0也会执行相同的操作。但我建议使用any,因为它的速度更快。因为Count将返回集合中的数据量,而any将在找到第一项时触发。 但如果您不确定集合是否已初始化,我建议您使用下一个结构:

if(entity!=null && entity.Any())
{
   //Do something. You will get her always without error, And you will be 100% sure that your collection is not empty and it is initialized
}

希望这有所帮助。

2
当您调用 if (entity.Count > 0) 但是entity == null时,会出现异常,因为在entity未初始化时,.Count不存在。请注意保留HTML标签。

1

entity.Any()是更好的选择。而且你不需要调用.ToList(),因为这会将所有数据从数据库中取出,然后仅检查其数量。


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