C# 简化if条件?

C# 简化if条件?,c#,if-statement,refactoring,C#,If Statement,Refactoring,我有以下代码: int someValue = 100; if (x == 5) { if (someCondition) { return someValue; } return someValue / 12; } if (x == 6) { if (someCondition) { return someValue * 12; } return someValue; } 正如您所看到的

我有以下代码:

int someValue = 100;
if (x == 5)
{
    if (someCondition)
    {
        return someValue;
    }
    return someValue / 12;
}

if (x == 6)
{
     if (someCondition)
     {
         return someValue * 12;
     }
    return someValue;
}

正如您所看到的,某些条件总是相同的,只是返回的值不同。有没有一种方法可以进一步简化此过程?

处理同一条条件语句的结果有不同的方法。正因为如此,它可能是更有效的(和更容易的眼睛)保持它的方式,你有它

如果每个条件语句的
return
表达式都相同,那么我会修改代码,但是每个代码块都有不同的
return
值,因此它是唯一的


因此,没有办法简化您的工作。

我个人会使用switch语句,而不是两个if语句。或者你可以做一个传递x*12或x/12的函数…

这取决于你所说的简化

以下代码行数较少,在可读性方面没有任何损失(IMO):

你有两个变量(
x
someCondition
),和3个不同的结果;因此,是的,您可以做得比两对嵌套测试更好。您所能做的就是:

if (((x == 5) && someCondition)) ||
    ((x == 6) && !someCondition)))
{
  return someValue;
}
else if (x == 5)
{
  return someValue / 12;
}
else if (x == 6)
{
  return someValue * 12;
} 

让我想想,你觉得这个怎么样

int someValue = 100;

if (x == 5)
 return someCondition ? someValue : (someValue / 12);
else if (x == 6)
 return someCondition ? (someValue * 12) : someValue;
这没有“嵌套”语句,因此在我看来更简洁:

int someValue = 100;

if ((x == 5 && someCondition) || (x == 6 && !someCondition))
    return someValue;

if (x == 5)
    return someValue / 12;

if (x == 6)
    return someValue * 12;

您可以切换
if
语句,以便只重复该条件一次。您可以使用
开关检查
x
值:

int someValue = 100;
if (someCondition) {
  switch (x) {
    case 5: return someValue;
    case 6: return someValue * 12;
  }
} else {
  switch (x) {
    case 5: return someValue / 12;
    case 6: return someValue;
  }
}

真是太多了,怎么样

Double scalar = 12;
switch(x)
{
  case 5 : 
    scalar = 1f/12;
    break;
  case 6 : 
    break;
  default : 
    return 100;
}
if (someCondition)     
{         
  return someValue;     
}     
return someValue * scalar; 
一行代码:

condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
这简单吗?我想是的。
这容易阅读吗?在某种程度上。

这样好吗?我不这么认为。(+生成的IL略有不同)

使用对象而不是开关,添加了“采用”测试

const state={
5: {
真:(someValue)=>someValue,
false:(someValue)=>someValue/12
},
6: {
真:(someValue)=>someValue*12,
false:(someValue)=>someValue
}
}
常量测试值=[0,-1,1,12,-12,1.2,-1.2]
test_values.map(value=>Object.keys(state).map(x=>Object.keys(state[x]).map(condition=>{
log(`value=${value},x=${x},result=${state[x][condition](value)}`)

})))
您能为涉及的变量提供更多的语义名称吗?可能有一种方法可以简化这个过程,只有当我们能够理解代码的目的时才有意义。我唯一能看到的是,如果(x==6)我经常得到完全相同的IFs,我会在前面加上一个else。你对冗长的内容无能为力:)嗯,是的,比我的好+1:)可读性的一个经验法则是在一个表达式中最多使用一个条件。这是一个单行命令,但我发现这比公认的答案更难理解。
condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
switch(x) {
    case 5: return someCondition ? someValue : someValue / 12;
    case 6: return someCondition ? someValue * 12 : someValue;
}