如果然后在c#中使用三元运算符(?:)

时间:2012-05-15 15:51:58

标签: c#

this.value1c.value1都可以为null或非null。所以共有4种组合进行测试。 value2也可以为null或非null。

下面的if-then-else可以用更短的东西代替,比如使用三元运算符(如果那么使用? :运算符) - 这对于这个特定情况是不好的做法,因为我们正在测试value1value2的4种组合?

     public override bool Equals(object obj)
     {
        bool value1_check = false;
        bool value2_check = false;
        var c = obj as ObjectType;

        if (this.value1 != null)
               value1_check = this.value1.Equals(c.value1);
        else if ((this.value1 == null) && (c.value1 == null))
               value1_check = true;
        else if ((this.value1 == null) && (c.value1 != null))
              value1_check = c.value1.Equals(this.value1);

        if (this.value2 != null)
               value2_check = this.value2.Equals(c.value2);
        else if ((this.value2 == null) && (c.value2 == null))
               value2_check = true;
        else if ((this.value2 == null) && (c.value2 != null))
              value2_check = c.value2.Equals(this.value2);

        return (value1_check && value2_check);
     }

4 个答案:

答案 0 :(得分:7)

你可以拨打Object.Equals(),已经完成了所有这些。

return Equals(this.Value1, c.Value1)
    && Equals(this.Value2, c.Value2);

答案 1 :(得分:4)

实际上,您可能需要?? Operator

var lhs= this.value1 ?? c.value1 ?? null;
var rhs = c.value1 ?? this.value1 ?? null;
var value1Check = lhs == rhs

应该和你的一样,但几乎100%的可读性!

答案 2 :(得分:0)

  

下面的if-then-else可以被更短的东西替换,比如使用   三元运算符?

没有..

三元运算符等于If Condition Then Else Statement你正在做的是IF Condition Else If Condition Then Else Statement,这是完全不同的。

我实际上怀疑你提供的代码没有做你想做的事。

if (this.value1 != null)                  
value1_check = this.value1.Equals(c.value1);           
else if ((this.value1 == null) && (c.value1 == null))   // Comment #1            
value1_check = true;           
else if ((this.value1 == null) && (c.value1 != null))   // Comment #2           
value1_check = c.value1.Equals(this.value1);   

评论#1 - 你明白this.value1必须等于null因为if子句是假的吗?这意味着您只需检查c.value1是否等于null

评论#2 - 再次...... this.value1必须为null,没有其他值。同样,c.value1必须不等于null,因为前一个(* else *)if子句也是false。

这意味着您可以将代码简化为以下内容:

    if (this.value1 != null)                  
    {
        value1_check = this.value1.Equals(c.value1);           
    }
    else if ( c.value1 != null )
    {
        value1_check = c.value1.Equals(this.value1);   
    }
    else // c.value1 is equal to null
    {
        value1_check = true;  
    }

当然,SLaks的解决方案是一个更好的主意。

答案 3 :(得分:0)

如果你还在想三元选项。

 value1_check= this.value1!=null? this.value1.Equals(c.value1):(c.value1!=null?c.value.Equals(this.value):value1_check=true);