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

时间:2016-11-09 12:02:51

标签: c# optimization

我有一个每天会被调用数千次的函数,我想优化这个函数,以便它尽可能快速有效。

在此功能中,将检查列表,并根据此检查的结果,将发生不同的操作。我的问题是确定此列表中有多少元素的最有效方法是什么。

显然,你可以像这样检查:

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
}

2 个答案:

答案 0 :(得分:2)

您应该使用属性#Powershell command PS: docker-machine env default #output might me like this $Env:DOCKER_TLS_VERIFY = "1" $Env:DOCKER_HOST = "tcp://172.16.104.171:2376" $Env:DOCKER_CERT_PATH = "C:\Users\username\.docker\machine\machines\default" $Env:DOCKER_MACHINE_NAME = "default" #DOCKER_HOST environmental variable should has same value as default machine PS:$Env:DOCKER_HOST = "tcp://172.16.104.171:2376" # should be same as default machine Env:DOCKER_HOST #Now list docker machines, default will be active. PS: docker-machine ls #default is not active and it look like this. NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * hyperv Running tcp://172.16.104.171:2376 v1.12.3 manager1 - hyperv Running tcp://172.16.104.168:2376 v1.12.3 ,因为它是预先计算的值,并且在您使用它时不需要重新计算该值,而方法Count将尝试成为一个自作聪明并尝试要弄清楚是否需要重新计算,但单独解决问题仍然比仅使用Count()还要努力。

所以,只需使用你最初做过的事情。

答案 1 :(得分:0)

对于List<T>Count属性实际上只返回一个字段,因为该实现是一个数组列表,需要非常准确地知道此集合中有多少元素。因此,您通过尝试缓存此值或任何相似内容而无法获得任何性能。这没问题。

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

编辑:使用Count()的替代方案实际上是一件非常糟糕的事情。由于List<T>是密封的,编译器将创建一个静态方法调用来访问Count属性,同时Count()导致通过接口进行强制转换和虚方法调用。这会花费更多的成本,而JIT编译器可以减少魔法,例如内联。