C# 列表与计数之间的差异>;0和列表。计数!=0

C# 列表与计数之间的差异>;0和列表。计数!=0,c#,c++,performance,compare,C#,C++,Performance,Compare,我有一张清单。list.Count>0和list.Count!=0?或者这些代码中有任何性能差异 if (list.Count > 0) // do some stuff if (list.Count != 0) // do some stuff 注意:list.Count不能小于ziro 实际上没有什么区别,因为列表中的项目不能少于0个,但是积分比较的==非常快,所以它可能比快。一种看起来更酷的方法是list.Any() (假设列表是指列表类型或任何内置IEnumer

我有一张清单。
list.Count>0
list.Count!=0
?或者这些代码中有任何性能差异

if (list.Count > 0)
    // do some stuff

if (list.Count != 0)
    // do some stuff
注意:
list.Count
不能小于ziro


实际上没有什么区别,因为列表中的项目不能少于0个,但是积分比较的
==
非常快,所以它可能比
快。一种看起来更酷的方法是list.Any()

(假设列表是指列表类型或任何内置IEnumerable/集合)

list.Count>0
list.Count!=0

对。第一个计算
list.Count
是否大于
0
。第二个参数评估它是否不等于
0
。“大于”和“不等于”是两码事

在这个特定的场景中,两种方法之间没有典型的区别 这两个。但是
=
>0
完全不同<代码>>0仅执行 当计数(条件表达式)大于0时,其中为
=计数时执行(条件表达式)
大于
0
以及小于
0


我想如果ICollection.Count是
uint
的类型,您就不会有这样的问题了。查看为什么ICollection.Count是
int
at


从可读性的角度来看,
list.Count!=0
将导致思考
计数是否可以为负值。所以我更喜欢个人风格的
list.Count>0

正如大家所解释的,从功能上讲,list.Count!=0
list.Count>0
作为列表。计数不能小于0

我做了一个快速测试,它显示了
!=0
>0
几乎同样快(这是超快的)。Linq的
list.Any()
并没有那么快

下面是测试代码(比较100000次以放大差异)

静态列表GetBigObjectList()
{
var list=新列表();
对于(int i=0;i<10000;i++)
{
添加(新对象());
}
退货清单;
}
静态void Main(字符串[]参数)
{
var myList=GetBigObjectList();
var s1=新秒表();
var s2=新秒表();
var s3=新秒表();
s1.Start();
对于(int i=0;i<100000;i++)
{
var isNotEqual=myList.Count!=0;
}
s1.停止();
s2.Start();
对于(int i=0;i<100000;i++)
{
var isGreaterThan=myList.Count>0;
}
s2.停止();
s3.Start();
对于(int i=0;i<100000;i++)
{
var isAny=myList.Any();
}
s3.停止();
Console.WriteLine(“所用时间!=:”+s1.elapsedmillyses);
Console.WriteLine(“所用时间>:”+s2.ElapsedMilliseconds);
WriteLine(“Any():”+s3.elapsedmillyses所用的时间);
Console.ReadLine();
}
它表明:

所用时间!=:0
>:0所用时间
任何()所用的时间:10


我猜在CPU寄存器级别,用于比较两个数字的汇编命令将逐位检查这些数字,并将激活一些条件标志以跳转到指定行。例如:

cmp BL, BH     ; BL and BH are cpu registers
je EQUAL_Label       ; BL = BH
jg GREATER_Label     ; BL > BH
jmp LESS_Label       ; BL < BH
cmp-BL,BH;BL和BH是cpu寄存器
je-EQUAL_标签;BL=BH
jg大齌标签;BL>BH
jmp-LESS_标签;BL
正如您所看到的,
je
jg
jmp
命令几乎是在以前的
cmp
(比较)命令上工作的最基本的命令。 总之,我们可以说这些比较命令之间没有显著的性能差异。

祝你好运

如果这会让你的程序成功或失败,那么你的状态很好。你为什么关心它,关于性能或正确性?@qxg,我只是好奇,在程序员的世界里,一个更好、更标准……没有区别。我会说,甚至没有一个周期的差异。还有一类类似的问题,我们能假设它们是指一个不少于0的列表吗?@TimothyStepanski你应该问OP。我没有这样的假设。列表的计数从来都不少于0,所以在这里它们是一样的。你怎么知道?如果你有权访问OP的代码,你能告诉我们它是用什么语言写的,以及
list
是什么吗。列表。计数将不会为负。我在第二次发言中想说的是
>0
之间的区别=
I虽然在相同的行中(向上投票),但实际上
list.Any()
似乎更慢!在下面检查我的答案:)
static List<object> GetBigObjectList()
{
    var list = new List<object>();
    for (int i = 0; i < 10000; i++)
    {
        list.Add(new object());
    }
    return list;
}

static void Main(string[] args)
{
    var myList = GetBigObjectList();
    var s1 = new Stopwatch();
    var s2 = new Stopwatch();
    var s3 = new Stopwatch();

    s1.Start();
    for (int i = 0; i < 100000; i++)
    {
        var isNotEqual = myList.Count != 0;
    }
    s1.Stop();

    s2.Start();
    for (int i = 0; i < 100000; i++)
    {
        var isGreaterThan = myList.Count > 0;
    }
    s2.Stop();

    s3.Start();
    for (int i = 0; i < 100000; i++)
    {
        var isAny = myList.Any();
    }
    s3.Stop();

    Console.WriteLine("Time taken by !=    : " + s1.ElapsedMilliseconds);
    Console.WriteLine("Time taken by >     : " + s2.ElapsedMilliseconds);
    Console.WriteLine("Time taken by Any() : " + s3.ElapsedMilliseconds);            
    Console.ReadLine();
}
cmp BL, BH     ; BL and BH are cpu registers
je EQUAL_Label       ; BL = BH
jg GREATER_Label     ; BL > BH
jmp LESS_Label       ; BL < BH