【问题标题】:Simplify conditional if statement c#简化条件 if 语句 c#
【发布时间】:2019-04-12 01:09:49
【问题描述】:

我有一个 if 语句变得有点麻烦。我想知道是否有更好的方法来处理多个类似的 if 语句,例如组合成一个或使用不同的条件语句,例如 while 或 do 循环。任何建议表示赞赏。

if (options.OpenCloseOverridesOptions != null && !options.OpenCloseOverridesOptions.AreEqual(OpenCloseOverridesOptions))
            return false;

        if (options.DeliveryOpenCloseOverridesOptions != null && !options.DeliveryOpenCloseOverridesOptions.AreEqual(DeliveryOpenCloseOverridesOptions))
            return false;

        if (options.PickupOpenCloseOverridesOptions != null && !options.PickupOpenCloseOverridesOptions.AreEqual(PickupOpenCloseOverridesOptions))
            return false;

        if (options.PickupServiceWindowOverridesOptions != null && !options.PickupServiceWindowOverridesOptions.AreEqual(PickupServiceWindowOverridesOptions))
            return false;

        if (options.DeliveryServiceWindowOverridesOptions != null && !options.DeliveryServiceWindowOverridesOptions.AreEqual(DeliveryServiceWindowOverridesOptions))
            return false;

        if (options.ServiceWindowOverridesOptions != null && !options.ServiceWindowOverridesOptions.AreEqual(ServiceWindowOverridesOptions))
            return false;

        if (options.LineItemsOptions != null && !options.LineItemsOptions.AreEqual(LineItemsOptions))
            return false;

简而言之,我基本上是在检查一个对象是否为空,如果不是,则使用扩展方法来确定类似对象是否相等。 (我没有覆盖 isEquals 和 getHashCode )。如果对象为 null,我无法调用 areEquals 扩展方法,因此需要进行检查。

【问题讨论】:

  • 为什么要重构。我觉得是这样的克莱尔
  • 如果你有一个功能程序,你可以把它提交给codereview.stackexchange.com的人
  • 另外,您可以使用 null 条件运算符 (?.) 简化您的 null 检查。
  • 有可能评估更多选项,所以我只是考虑长期的可读性和可维护性。此外,我已经很久没有使用堆栈了,显然,有一个 StackOverflow 用于代码审查......应该在那里代替吗?
  • 好的 @BrootsWaymb 你回答了我的问题,因为我输入它......太棒了

标签: c# .net if-statement conditional


【解决方案1】:

如果要返回bool,可以直接返回条件。

我们可以使用另一个技能(De Morgan's laws)让!进入语句,将所有逻辑反转,让代码更清晰。

return  
    (options.OpenCloseOverridesOptions == null || options.OpenCloseOverridesOptions.AreEqual(OpenCloseOverridesOptions)) &&
    (options.DeliveryOpenCloseOverridesOptions == null || options.DeliveryOpenCloseOverridesOptions.AreEqual(DeliveryOpenCloseOverridesOptions)) &&
    (options.PickupOpenCloseOverridesOptions == null || options.PickupOpenCloseOverridesOptions.AreEqual(PickupOpenCloseOverridesOptions))&&
    (options.PickupServiceWindowOverridesOptions == null || options.PickupServiceWindowOverridesOptions.AreEqual(PickupServiceWindowOverridesOptions) &&
    (options.DeliveryServiceWindowOverridesOptions == null || options.DeliveryServiceWindowOverridesOptions.AreEqual(DeliveryServiceWindowOverridesOptions)&&
    (options.ServiceWindowOverridesOptions == null || options.ServiceWindowOverridesOptions.AreEqual(ServiceWindowOverridesOptions)&&
    (options.LineItemsOptions == null || options.LineItemsOptions.AreEqual(LineItemsOptions)

【讨论】:

  • 我试试看
  • @#$% 非常感谢,伙计。谢谢大家的回复。这么简单,我怎么没想到这个
【解决方案2】:

试试这个:

if (options.OpenCloseOverridesOptions != null && !options.OpenCloseOverridesOptions?.AreEqual(OpenCloseOverridesOptions)
        || !options.DeliveryOpenCloseOverridesOptions?.AreEqual(DeliveryOpenCloseOverridesOptions)
        || !options.PickupOpenCloseOverridesOptions?.AreEqual(PickupOpenCloseOverridesOptions))
        return false;

【讨论】:

    【解决方案3】:

    使用 C#6 中引入的 safe-navigation operator 和带有多个条件的单个 if 语句,例如:

    if (options.OpenCloseOverridesOptions?.AreEqual(OpenCloseOverridesOptions) != true
        || options.DeliveryOpenCloseOverridesOptions?.AreEqual(DeliveryOpenCloseOverridesOptions) != true
        || options.PickupOpenCloseOverridesOptions?.AreEqual(PickupOpenCloseOverridesOptions) != true)
        return false;
    

    【讨论】:

    • 感谢响应而不是 or 运算符,我应该使用 and (&&) 因为如果不返回 false,我需要它们都为 true
    • @DylanGodfrey:根据您发布的代码 sn-p,如果任何*选项不相等,您想返回 false,不是吗?
    • 是的,我写了一个单元测试。我正在转换我的代码以反映您的响应
    • 你应该提到安全导航是在 c# 6.0 中引入的。以前的版本呢?这将是一个缺陷
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2010-09-07
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多