2010-08-18 99 views
2

這裏應該是C#專家的一個簡單問題。C#如何檢查兩個值中的一個是否爲真?

我基本上要檢查,如果一個值或其他爲TRUE,在代碼野生刺低於:

if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))  
{ 
    // is true 
} 

這是正確的嗎?

感謝

+0

你是說至少有一個值是真的,或者其中的一個值是真的? – mdma 2010-08-18 22:48:35

+6

不會「是男還是女」永遠是真的嗎?無論如何,在地球上? – Ray 2010-08-18 22:49:15

+1

@射線,如果有變性或「不想回答」選項會怎樣? – 2010-08-18 22:50:24

回答

5

使用||(雙管),邏輯或。

bool isMale = Boolean.Parse(staff.getValue("Male"); 
bool isFemale = Boolean.Parse(staff.getValue("Female"); 
if (isMale || isFemale) // note double pipe || 
{ 
    // do something if true 
} 

在C#語句表達式是從左到右計算的。在OR操作中,如果第一個表達式等於true,則不會評估第二個表達式。

7

聽起來像你在尋找邏輯OR。

if(condition1 || condition2) 
{ 
} 
+0

問題中給出的代碼已經使用邏輯OR運算符的*一個 - '|' - 儘管我同意它是幾乎總是優先使用短路'||'版本。 – LukeH 2010-08-18 23:04:35

+4

@LukeH'|'不是邏輯OR運算符。它是按位或運算符。 – Markos 2010-08-19 08:03:11

+1

@Markos:不在C#中。對於布爾類型,運算符'|'是一個非短路邏輯OR運算符。 – Gorpik 2010-08-19 08:20:50

2

的條件或操作||是你所需要的

if ((Boolean.Parse(staff.getValue("Male")) || Boolean.Parse(staff.getValue("Female"))) 
{ 
    //is true 
} 

如果第一個條件是TRUE,那麼第二個條件沒有被選中,因爲結果顯然會返回TRUE

+0

問題中示例代碼使用的'|'運算符也是一個邏輯OR運算符,儘管我同意使用短符號「||」來代替它幾乎總是可取的。 – LukeH 2010-08-18 23:07:02

+0

我的不好 - 我把它編輯爲'有條件的',因爲這是我看到它被調用的方式。 – 2010-08-18 23:38:58

-3

無論如何需要一點例外檢查。該Boolean.Parse()方法獲取一個字符串作爲參數,並返回要麼truefalse只有的說法,一旦剝離出來空白的,等於「真」或「假」(注意大小寫)。在任何其他情況下,函數都會返回一個異常。

假設staff.getValue("Male")staff.getValue("Female")的可能值正好是那兩個,那麼簡單的析取(||)就足夠了。如果任何其他返回值是可能的,包括null和空字符串,那麼你必須檢查異常

bool isMale; 
try { 
    isMale = Boolean.Parse(staff.getValue("Male")); 
} catch(Exception e) { 
    isMale = Boolean.False; 
} 
try { 
    isFemale = Boolean.Parse(staff.getValue("Female")); 
} catch(Exception e) { 
    isFemale = Boolean.False; 
} 
if (isMale || isFemale) // note double pipe || 
{ 
    // do something if true 
} 

或手動比較

bool isMale = Boolean.TrueValue == staff.getValue("Male"); 
bool isFemale = Boolean.TrueValue == staff.getValue("Female"); 
if (isMale || isFemale) // note double pipe || 
{ 
    // do something if true 
} 
+5

根據MSDN,Boolean.Parse是不區分大小寫的。這將是一個很好的使用Boolean.TryParse而不是Boolean.Parse來避免必須進行異常處理的地方。 – 2010-08-18 23:15:44

+3

什麼是Boolean.True,即使它是有效的,再次將它與布爾值進行比較的優點是什麼?這可以永遠持續下去:'= Boolean.True == staff.getValue(「Female」)== true == true == true ...... == true'。重點是什麼? – 2010-08-18 23:50:29

+1

您不是「檢查例外」。你在「吞噬異常,讓那些繼承你的代碼的人扯掉他們的頭髮。」這正是與例外無關的事情;如果解析布爾值可能會失敗,請使用Phil Lamb建議的TryParse()。如果查找空返回值只意味着將「false」分配給isMale或isFemale,則只需使用空合併運算符「??」即可。 http://msdn.microsoft.com/en-us/library/ms173224.aspx。即'isMale = staff.getValue()?假;' – jloubert 2010-08-19 01:02:28

14

如果只有一個應該是真的,那麼它是:

var male = bool.Parse(staff.getValue("Male")); 
var female = bool.Parse(staff.getValue("Female")); 

if (male^female)  
{ 
    //is true 
} 
0

要指定性別是否與「真」的值指定,而不是「假」,

bool genderIsSpecified = staff.getValue("Male") | staff.getValue("Female"); 

..只能確定它是否是這些值中的一個,而不是它的值的對象staff是。

所以,萬一這個問題是文字,而不是一個抽象的例子,...

男性或女性..大家是一個或另一個。也許在你的問題中,你打算問兩個問題中的哪一個?在這種情況下,

bool defaultGenderIfNoGenderDocumented = true; // male 
bool MaleIfTrue_FemaleIfFalse = !string.IsNullOrEmpty(staff.getValue("Male")) 
    ? bool.Parse(staff.getValue("Male")) 
    : string.IsNullOrEmpty(staff.getValue("Female")) 
     ? bool.Parse(staff.getValue("Female")) 
      ? false 
      : defaultGenderIfNoGenderDocumented 
     : defaultGenderIfNoGenderDocumented; 

或者乾脆,

// assume value is properly populated, ignore "Female" value 
bool isMale = bool.Parse(staff.getValue("Male")); 
1

注意TryParse工作更快捷,更安全的然後就Parse因爲不出錯的情況下拋出異常。 TryParse返回指示解析成功或不成功的bool。

所以這兩種分析方法應返回true只有經過 - 主做檢查

bool male, female; 
if ((Boolean.TryParse(staff.getValue("Male"), out male) && 
    Boolean.TryParse(staff.getValue("Female"), out female)) && 
    (male || female)) // or^
{ 
    // do stuff 
} 

bool male, female; 
if (Boolean.TryParse(staff.getValue("Male"), out male) && 
    Boolean.TryParse(staff.getValue("Female"), out female))   
{ 
    if(male) { } 
    else if (female) { } // or just else 
} 
else 
{ 
    // staff contains wrong data. Probably "yeap" instead of "true" 
} 
0

這是一個類似的情況,但我檢查了三個或更多的布爾值。

Thread th = new Thread(() => 
       { 
        while (true) 
        { 
         bool allReadComplete = true; 

         foreach (IDataProvider provider in lstDataProviders) 
         { 
          provider.StartReading(); 

          if (provider.FinishedReading) 
           allReadComplete = allReadComplete && provider.FinishedReading; 
          else 
           allReadComplete = provider.FinishedReading; 
         } 

         // to induce some context switching 
         Thread.Sleep(0); 

         if (allReadComplete) 
          break; 
        } 

        Console.WriteLine("Thread Exiting"); 

       }); 
      th.IsBackground = true; 
      th.Start(); 
相關問題