确定列表是否为空的最有效方法
本文关键字:有效 方法 列表 是否 | 更新日期: 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编译器可以做的诸如内联之类的魔术更少。