2009-08-28 129 views
2

我的查询很简单,如果可能的话,在C#中执行以下操作。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> 

返回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

我不知道你在问什么...... – RedFilter 2009-08-28 14:10:23

+0

究竟是什么问题? – 2009-08-28 14:11:24

+0

问题是什么'(false || null ||“1º”||“2º”)'评估在C#中。答案是它不能编译,因为C#布尔运算符是强类型的。但我认为知道是否有一种方法可以在C#中编写类似的方法会很有趣...... – dtb 2009-08-28 14:13:36

回答

3

这些表达式是无效的C#,因为.NET ||&&运营商是强类型。

有,然而,在x ?? y操作返回y如果xnullx否则:

string value1; 
string value2 = "default value"; 

value1 = Request.Form["valueA"] ?? Request.Form["valueB"] ?? value2; 
           ^      ^
+0

+1。但是如果url包含“?valueA =&valueB = Hello”会发生什么?;) – AnthonyWJones 2009-08-28 14:32:30

+0

@Anthony什么都不会发生一个字符串“”不影响? nor和变量 – 2009-08-28 14:41:27

+0

编辑:和=任何 – 2009-08-28 14:42:03

1

如果我理解你的“问题”正确,你要明白,C#手柄输入更加严格的方式。空值不会被视为false,事实上,您可以在布尔表达式中使用的唯一类型是布尔值,与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 

整数是值类型,并且不能为空。

解决方案编辑

每当有使用前我掖了这一切的属性里面查询字符串/表单值的“来料加工”的异样。 (事实上​​,我倾向于把所有这样的访问放在一个属性中,即使它只是{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; 
} 

现在使用Value属性,您将使用value1属性。

0

如果你想要一系列布尔,为什么不写一个能为你转换的类,应用你想要的规则。如果你的规则是“如果它是空的,它是假的;如果它是非空的,它是布尔值,否则它是真的”,那么这种方法适用于你。

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; 
}