简化C#中的条件if语句

3

我有一个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;

简要概述:我基本上是在检查一个对象是否为null,如果不是,则使用扩展方法来确定是否存在类似的对象相等。(我没有覆盖isEquals和getHashCode方法)。如果对象为null,则无法调用areEquals扩展方法,所以必须进行该检查。


2
为什么要重构?我认为现在的代码已经很清晰了。 - Antoine V
2
如果您有一个功能完备的程序,您可以将其提交给 https://codereview.stackexchange.com/ 的相关人员。 - Broots Waymb
1
此外,您可以使用空值条件运算符(?.)来简化空值检查。 - Broots Waymb
有可能会有更多的选项需要评估,所以我只考虑长期的可读性和可维护性。此外,我已经很久没有使用堆栈了,显然,有一个用于代码审查的StackOverflow...这应该放在那里呢? - Dylan Godfrey
1
好的 @BrootsWaymb,你在我提问时就回答了...太棒了。 - Dylan Godfrey
@BrootsWaymb的想法在mm8示例中得到了生动的阐述。我会尝试一下,感谢您的及时回复! - Dylan Godfrey
3个回答

1

使用C#6中引入的安全导航运算符和单个if语句来处理多个条件,例如:

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

谢谢回复。我应该使用“and”(&&)而不是“or”运算符,因为我需要它们全部为真,否则返回假。 - Dylan Godfrey
根据您发布的代码片段,@DylanGodfrey,如果任何*选项不相等,您想返回false,是吗? - mm8
是的,我写了一个单元测试。我正在将我的代码转换为与您的响应相同。 - Dylan Godfrey
你应该提到安全导航在C# 6.0中被引入了。那么之前的版本呢?这将是一个缺陷。 - Hassaan

1
尝试这个:

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

1
如果你想返回bool,可以直接返回条件。我们可以使用另一种技巧(德摩根定律),将let!插入语句中,这将反转所有逻辑,让代码更清晰。
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)

我会试一试。 - Dylan Godfrey
@#$% 这太好了,谢谢,伙计。感谢大家的回复。这么简单我怎么没想到。 - Dylan Godfrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接