三元运营商未给出预期结果

时间:2018-05-15 11:58:22

标签: c#

我正在尝试运行以下声明。

value = device.WeightLB == null ? string.Empty :
        ((GlobalVariables.MeasurementId == 1) ? 
        (FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit) : 
        (FormatHelper.BuildDecimal(device.WeightLB) + Constants.LbUnit));

预期:

如果MeasurementId1,那么我应该在KG中获得结果。

问题:

如果MeasurementId1,那么我的结果是Lb。

我是否错过了应该编写查询的序列(大括号序列)或其他错误?

Constants.KgUnit将返回字符串kg和 Constants.LbUnit将返回字符串lb

在调试期间,值为:

GlobalVariables.Measurementid == 1  
device.WeightKG  == 10 
Constants.KgUnit == "kg"
device.WeightLB  == 22.04  
Constants.LbUnit == "lb"

需要帮助。
以上数值就是我得到的。

3 个答案:

答案 0 :(得分:1)

请尝试使用以下代码:

if(device.WeightLB == null)
{
    value = string.Empty;
}
else if(GlobalVariables.MeasurementId == 1)
{
    value = FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit;
}
else
{
    value = FormatHelper.BuildDecimal(device.WeightLB) + Constants.LbUnit;
}

答案 1 :(得分:0)

这段代码很多奇怪的东西,因为它的编写方式非常复杂,总是编写易于理解的代码读给要维护代码的第三人。

value = device.WeightLB == null ? string.Empty :
        ((GlobalVariables.MeasurementId == 1) ? 
        (FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit) : 
        (FormatHelper.BuildDecimal(device.WeightLB) + Constants.LbUnit));
  1. 第一行是device.WeightLB == null然后返回空字符串。但是如果你在device.WeightKG
  2. 中有价值怎么办?
  3. 如果不为null则会进入第二个三元条件
  4. 在你的三元条件(FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit))中,除非你有device.WeightKG
  5. 的价值,否则不会执行

    //花了15分钟来理解你写的内容,并希望你明白我的观点。

    为什么不以简单的方式做到这一点,通过这样做,你会得到你的答案,为什么你没有得到价值

    if (device.WeightLB == null ) 
       return string.Empty;
    
    //this will not get execute when  device.WeightLB == null 
    if( GlobalVariables.MeasurementId == 1) 
           return (FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit);
    else 
           return (FormatHelper.BuildDecimal(device.WeightLB) + Constants.LbUnit);
    

答案 2 :(得分:0)

我发现即使MeasurementId = 1检查WeightLB也很奇怪。也许这就是问题?

代码的作用已经解释,我在这里写的只是一个建议如何以更易读的方式编写它:

提取一个方法,只将权重转换为带有单位的字符串(如果可能)

private string Calculate(Device device)
{
    if (device.WeightLB == null)
        return string.Empty;

    return GlobalVariables.MeasurementId == 1 ? 
            (FormatHelper.BuildDecimal(device.WeightKG) + Constants.KgUnit : 
            (FormatHelper.BuildDecimal(device.WeightLB) + Constants.LbUnit));
}

还可以做的是创建扩展以用流利的方式写作

private string Calculate(Device device)
{
    if (device.WeightLB == null)
        return string.Empty;        

    return GlobalVariables.MeasurementId == 1 ? 
            device.WeightKG.BuildDecimal().ToKgUnit(): 
            device.WeightLb.BuildDecimal().ToLbUnit();
}

//Extension implementation
public static class  MyExtensions
{
    public static decimal BuildDecimal(this string value)
    {
        return FormatHelper.BuildDecimal(value);
    }

    public static string ToKgUnit(this decimal value)
    {
        return value+Constants.KgUnit;
    }

    public static string ToLbUnit(this decimal value)
    {
        return value+Constants.LbUnit;
    }
}