C# 三元vs链式If-else If(性能)

C# 三元vs链式If-else If(性能),c#,performance,if-statement,big-o,ternary,C#,Performance,If Statement,Big O,Ternary,我做了尽职调查,看看是否有人问过这个问题,但没有发现任何相同的东西,但接近,所以这里开始 假设我有一系列if-else-if语句 foreach (value in valueList) if (value == 120) { w = true; } else if (value == 140) { x = true; } else if (value == 160) { y = true; } else if (v

我做了尽职调查,看看是否有人问过这个问题,但没有发现任何相同的东西,但接近,所以这里开始

假设我有一系列if-else-if语句

foreach (value in valueList)
    if (value == 120) {
        w = true;
    } else if (value == 140) {
        x = true;
    } else if (value == 160) {
        y = true;
    } else if (value == 180) {
        z = true;
    }
}
将else if链更改为三元表达式(如:

foreach (value in valueList) {
    w = (value == 120) ? true : false;
    x = (value == 140) ? true : false;
    y = (value == 160) ? true : false;
    z = (value == 180) ? true : false;
}
我的第一个倾向是否定的。因为
for
循环,每次循环发生时都会进行分配。而在if-else-if链中,赋值只进行一次。但是比较更频繁(对吗?)。谁能帮我解决这个问题

我知道
开关
在性能上很容易击败这两者。我是否可以假设使用
开关
不是一个选项

我猜这个问题中的另一个问题是,这两者之间的Big-O比较是什么?

这两种功能完全不同。表现是无关紧要的;他们不会做同样的事情

如果满足条件,第一个代码段将相应的变量设置为
true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值

第二个代码段在每次迭代中为每个变量分配一个值

因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。

两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情

如果满足条件,第一个代码段将相应的变量设置为
true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值

第二个代码段在每次迭代中为每个变量分配一个值

因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。

两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情

如果满足条件,第一个代码段将相应的变量设置为
true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值

第二个代码段在每次迭代中为每个变量分配一个值

因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。

两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情

如果满足条件,第一个代码段将相应的变量设置为
true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值

第二个代码段在每次迭代中为每个变量分配一个值


因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,所以后者完全是错误的。

好吧,在
整数的情况下,当我有太多的情况时,我真的喜欢使用
开关@伊玛解释道。否则,什么看起来更好或更“可读”才重要


然而,使用带有
字符串的
开关
是一个完全不同的故事,如本文所述

好吧,对于
整数
,当我有太多的情况时,我真的很喜欢使用
开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要


然而,使用带有
字符串的
开关
是一个完全不同的故事,如本文所述

好吧,对于
整数
,当我有太多的情况时,我真的很喜欢使用
开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要


然而,使用带有
字符串的
开关
是一个完全不同的故事,如本文所述

好吧,对于
整数
,当我有太多的情况时,我真的很喜欢使用
开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要


然而,使用带有
字符串的
开关
是一个完全不同的故事,如本文所述

请注意,这两种解决方案非常不同。第一个变量只将
true
赋值给这四个变量中的一个,而另一个变量将覆盖这四个变量之前的任何值

也就是说,在第二个代码中使用三元运算符是非常糟糕的。您可以直接指定比较结果:

w = value == 120;
x = value == 140;
y = value == 160;
z = value == 180;
撇开语义不谈,这也可能使它比if/else结构更具性能。您可能认为只运行一个比较会使它更快,因此第一个解决方案应该更好,但事实上,分支。而且,由于比较操作实际上非常快,只需将比较结果分配四次就可能“更快”

请注意,所有这些实际上都不会对性能产生任何实际影响。两者都是非常低级的,并且很可能在应用程序的代码中有其他更慢的东西,成为一个更可能的瓶颈。所以我不会在这里强调使用一种或另一种方式来实现性能;