如何将嵌套的三元运算符转换为嵌套的if-else语句?

Ped*_*lho 3 c# datetime if-statement ternary

我很难将下面的C#代码转换为if-else语句,以便可以理解业务逻辑。有人可以帮我检查我的转换是否正常吗?

码:

dateInit = objInstance == null ? (DateTime?)null:
                objInstance.DateAnt == null ?
                    objInstance.DatePost > otherObjInstance.DateCon ?
                        (DateTime?)null :
                        objInstance.DatePost :
                objInstance.DateAnt;
Run Code Online (Sandbox Code Playgroud)

我的转换:

if (objInstance == null)
{
    dateInit = (DateTime?)null;
}
else
{
    if (objInstance.DateAnt == null)
    {
        if (objInstance.DatePost > otherObjInstance.DateCon)
        {
            dateInit = (DateTime?)null;
        }
        else
        {
            dateInit = objInstance.DatePost;
        }
    }
    else
    {
        dateInit = objInstance.DataAnt;
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

您的转换似乎正确。但是,我将通过两种方式对其进行改进。

首先,形式上null不需要强制转换if。(?:操作员对结果中可能出现的类型和替代位置有一定的限制,这导致开发人员插入强制类型转换。)

其次,这些if语句不必要地嵌套。整个事情可以表达为:

if (objInstance == null)
  dateInit = null;
else if (objInstance.DateAnt != null)
  dateInit = objInstance.DataAnt;
else if (objInstance.DatePost > otherObjInstance.DateCon)
  dateInit = null;
else
  dateInit = objInstance.DatePost;
Run Code Online (Sandbox Code Playgroud)

从这个版本开始,业务逻辑比我认为的版本更容易理解。

我们可以使用两个规则进行此转换。第一:

if (x)
  X
else 
{
  if (y)
    Y
  else
    Z
}
Run Code Online (Sandbox Code Playgroud)

是相同的

if (x)
  X
else if (y)
  Y
else
  Z
Run Code Online (Sandbox Code Playgroud)

在页面上更简单。

第二:

if (x)
{
  if (y)
    Y
  else
    Z
}
else
  NX
Run Code Online (Sandbox Code Playgroud)

是相同的

if (!x)
  NX
else 
{
  if (y)
    Y
  else
    Z
}
Run Code Online (Sandbox Code Playgroud)

现在我们再次处于第一种情况,并且可以进一步简化。

通过重复组合这些规则,可以简化许多复杂的if-else语句。