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

标签 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;

我的转化:

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;
    }
}

最佳答案

您的转换似乎是正确的。但是,我会通过两种方式改进它。

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

其次,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;

我认为这个版本的业务逻辑比你的版本更容易理解。

我们可以使用两条规则进行这种转换。第一:

if (x)
  X
else 
{
  if (y)
    Y
  else
    Z
}

相同
if (x)
  X
else if (y)
  Y
else
  Z

在页面上哪个更简单。

第二个:

if (x)
{
  if (y)
    Y
  else
    Z
}
else
  NX

相同
if (!x)
  NX
else 
{
  if (y)
    Y
  else
    Z
}

现在我们又回到了第一种情况,可以进一步简化。

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

关于c# - 如何将嵌套的三元运算符转换为嵌套的 if-else 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55189080/

相关文章:

javascript - 如何使用 if 语句来检查页面的文本?

c - 子 PID 的执行和打印

Java - 剪刀石头布 - 如果错误则额外循环一次并计算获胜次数

c# - Ef Code First 外键失败

c# - 更改 ComboBox 的设计

Javascript 12 小时制到 24 小时制格式转换器

ruby-on-rails - Rails 函数获取 "hours, minutes, seconds"直到时间戳?

c# - 服务器上存在文件,但列表目录命令未返回

如果项目在层次结构中处于非事件状态,则触发 C# if 条件

c# - 为什么在 C# 中将 DateTime 插入 MySQL 会出错?