2009-08-28 105 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; 
}