多个选项的更有效'if'语句

BMi*_*lls 18 c# if-statement

我想知道是否有人有一些想法,使以下更短,更有效.我有3个下拉菜单,用户选择较低的年龄限制,年龄上限和性别.他们可以根据需要选择任意数量,甚至没有.然后我有一个if语句,它将根据他们选择的内容进行处理.假设l,u和g是传递的参数.

if((age > l && age < u && gender == g)
|| (age > l && age < u && g == null)
|| (age > l && u == null && g == null)
|| (age < u && gender == g && l == null)
|| (age < u ...etc etc)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法形成这个而不是一个乏味的if语句?

小智 65

您可以通过为每个条件创建变量来使其更具可读性.

var lowerAgeLimitMet = (l == null || age > l);
var upperAgeLimitMet = (u == null || age < u);
var genderLimitMet = (g == null || gender == g);
if(lowerAgeLimitMet && upperAgeLimitMet && genderLimitMet)
{
    //Do work here
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个解决方案,因为它使代码更具可读性和可操作性. (11认同)
  • 如果需要,它还可以更容易地告诉用户他们没有遇到哪些条件. (5认同)
  • 代码大小的简单性和可维护性! (4认同)
  • 我更进一步,将l重命名为lowerAgeLimit,将u重命名为upperAgeLimit,将g重命名为gender.为什么要使用1个字母的变量,你是否担心会磨损你的键盘或用完字母? (3认同)

Fra*_*tyx 8

这应该工作:

if((age > l || l == null) && (age < u || u == null) && (gender == g || g == null))
   ...
Run Code Online (Sandbox Code Playgroud)

  • 此外,由于条件是从左到右评估的,我会留下空检查.像这样:`(l == null || age> l)&&(u == null || age <u)&&(g == null || gender == g)`.同样,C#编译器也可以优化它. (4认同)
  • 您可能需要小心使用"高效"这个词,它在编程时具有非常特殊的含义.我不是说你错了(你已经减少了比较(即年龄> l),这是重要的部分(不是行)所以它更有效)但是@Maarten已经避开了编译器可能已经调整了你的代码为了提高效率,所以问"我怎样才能提高效率"往往会得到"你没必要"的回复.或'为什么?' 在我看来,你真的只想让代码更短更紧凑,效率不是真正的因素! (3认同)
  • 如果OP代码的问题是低效而不是可读性,那么这将是正确的答案.然而问题是后者,并且此级别的微优化不太可能对性能产生显着影响.我非常喜欢Synvert的解决方案,因为它解决了代码的实际问题,即使这不一定是OP确定的问题. (2认同)