代码之家  ›  专栏  ›  技术社区  ›  andres descalzo

C语言中逻辑运算符的结构#

  •  2
  • andres descalzo  · 技术社区  · 15 年前

    我的查询很简单,就像我所做的一样,如果可能的话,用C#实现下面的查询。

    <html>
    <head>
    <script src="../jquery-1.3.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function(){
            $("#datos").append("<span style=\"font-weight:bold\">(false || null || \"1º\" || \"2º\")</span> : <span>"+(false || null || "1º" || "2º")+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(false && null || false || \"2º\")</span> : <span>"+(false && null || false || "2º")+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(false && true || \"1º\" || \"2º\")</span> : <span>"+(false && true || "1º" || "2º")+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(true && null && 6 && 5)</span> : <span>"+(true && null && 6 && 5)+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(null && true && false && false)</span> : <span>"+(null && true && false && false)+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(false && true && false && false)</span> : <span>"+(false && true && false && false)+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(true && 1 && true && 2)</span> : <span>"+(true && 1 && true && 2)+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(true && \"1º\" && true && \"2º\")</span> : <span>"+(true && "1º" && true && "2º")+"</span><br />");
            $("#datos").append("<span style=\"font-weight:bold\">(true && true && \"1º\" && \"2º\")</span> : <span>"+(true && true && "1º" && "2º")+"</span><br />");
        });
    </script>
    </head>
    <body>
    <div id="datos"></div>
    </body>
    </html>
    

    (false || null || "1º" || "2º") : 1º
    (false && null || false || "2º") : 2º
    (false && true || "1º" || "2º") : 1º
    (true && null && 6 && 5) : null
    (null && true && false && false) : null
    (false && true && false && false) : false
    (true && 1 && true && 2) : 2
    (true && "1º" && true && "2º") : 2º
    (true && true && "1º" && "2º") : 2º
    

    非常感谢。

    --编辑评论

    我需要在C#中完成以下任务:

    string value1 = string.Empty;
    string value2 = "default value";
    
    // Request.Form["valueA"] and Request.Form["valueB"] may be null
    value1 = (Request.Form["valueA"] || Request.Form["valueB"] || value2);
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   dtb    15 年前

    这些表达式在C#中无效,因为.NET || &&

    然而,还有一个问题 x ?? y 返回的运算符 y 如果 x null x 否则:

    string value1;
    string value2 = "default value";
    
    value1 = Request.Form["valueA"] ?? Request.Form["valueB"] ?? value2;
                                    ^                         ^
    
        2
  •  1
  •   AnthonyWJones    15 年前

    如果我正确理解你的“问题”,你需要理解C#以更严格的方式处理类型。Null不被视为false,事实上,您可以在布尔表达式中使用的唯一类型是boolean,这与javascript不同,javascript将接受布尔表达式中的任何类型,并对其含义进行合理猜测。

     var r1 = (null ?? "1º" ?? "2º") // Results in 1º
     var r2 = (null ?? null ?? "2º") // Results in 2º
    

    但是,这不起作用:-

     var r1 = (null ?? 1 ?? 2)  //Compile error
    

    编辑解决方案

    无论何时,只要在使用前有“处理”querystring/form值的一点点提示,我都会将其塞进属性中。(事实上,我倾向于将所有此类访问权放置在一处房产中,即使它是公正的 {return Request.QueryString["stuff"]; } ).

     string _Value;
     public string Value
     {
        get
        {
           if (_Value == null)
           {
             _Value = CoalesceNullOrEmpty(Request.Form["valueA"],
               Request.Form["valueB"],
               "Default Value");
             }
           }
           return _Value;
        }
     }
    
    //Can place this in the page but is more useful in a utility dll
    public string CoalesceNullOrEmpty(params string[] values)
    {
      foreach(string value in values)
        if (!String.IsNullOrEmpty(value))
          return value;
    
      return null;
    }
    

    现在,在使用value1属性的地方使用Value属性。

        3
  •  0
  •   plinth    15 年前

    如果您想要一系列布尔,为什么不编写一个类来为您转换,应用您想要的规则呢。如果您的规则是“如果为null,则为false;如果为非null,则为布尔值,否则为true”,则此方法适用于您。

    static List<bool> ToBool(FormCollection form) { // couldn't find the type on MSDN
        List<bool> result = new List<Bool>();
        foreach (object o in form) {
             if (o == null) {
                 result.Add(false);
             }
             else {
                 if (o is bool) {
                     result.Add((bool)o);
                 }
                 else {
                    // do whatever other conversion
                    result.Add(true); // probably the wrong thing - depends on what you're testing
                 }
             }
         }
         return result;
    }