确定列表是否为空的最有效方法

本文关键字:有效 方法 列表 是否 | 更新日期: 2023-09-27 18:17:10

我有一个函数每天将被调用数千次,我想优化这个函数,使其尽可能快速高效。

在这个函数中,将检查一个列表,根据检查的结果,将发生不同的操作。我的问题是,确定这个列表中有多少元素的最有效方法是什么?

显然,你可以这样检查:

List<Objects> data = GetData();
if (data.Count == 0)
{
    //Do something
}
else if (data.Count < 5)
{
    //Do something with a small list
}
else
{
    //Do something with a larger list
}

这已经是最快/最有效的方法了吗?我想到了一个替代方案,但我需要一些建议

List<Objects> data = GetData();
int amountOfObjects = data.Count();
if (amountOfObjects == 0)
{
    //Do something
}
else if (amountOfObjects < 5)
{
    //Do something with a small list
}
else
{
    //Do something with a larger list
}

确定列表是否为空的最有效方法

您应该使用属性Count,因为它是一个预先计算的值,并且在使用它时不需要重新计算值,而方法Count()将尝试成为一个聪明的驴子,并尝试计算是否需要重新计算,但单独计算仍然比仅使用Count更努力。

所以就用你最初做的。

对于List<T>, Count属性实际上只是返回一个字段,因为实现是一个数组列表,需要非常精确地知道这个集合中有多少个元素。因此,尝试缓存这个值或类似的东西不会获得任何性能。这是没有问题的。

当您使用其他集合实现时,这种情况可能会有所不同。例如,LinkedList在概念上不知道它里面有多少元素,但必须对它们进行计数,这是一个昂贵的操作。

编辑:你选择使用Count()实际上是一件非常糟糕的事情。由于List<T>是密封的,编译器将创建一个静态方法调用来访问Count属性,同时Count()将在接口上进行强制转换和虚方法调用。这就造成了更多的成本,并且jit编译器可以做的诸如内联之类的魔术更少。