這裏應該是C#專家的一個簡單問題。C#如何檢查兩個值中的一個是否爲真?
我基本上要檢查,如果一個值或其他爲TRUE,在代碼野生刺低於:
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
這是正確的嗎?
感謝
這裏應該是C#專家的一個簡單問題。C#如何檢查兩個值中的一個是否爲真?
我基本上要檢查,如果一個值或其他爲TRUE,在代碼野生刺低於:
if ((Boolean.Parse(staff.getValue("Male")) | Boolean.Parse(staff.getValue("Female")))
{
// is true
}
這是正確的嗎?
感謝
使用||
(雙管),邏輯或。
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,則不會評估第二個表達式。
的條件或操作||
是你所需要的
if ((Boolean.Parse(staff.getValue("Male")) || Boolean.Parse(staff.getValue("Female")))
{
//is true
}
如果第一個條件是TRUE
,那麼第二個條件沒有被選中,因爲結果顯然會返回TRUE
。
問題中示例代碼使用的'|'運算符也是一個邏輯OR運算符,儘管我同意使用短符號「||」來代替它幾乎總是可取的。 – LukeH 2010-08-18 23:07:02
我的不好 - 我把它編輯爲'有條件的',因爲這是我看到它被調用的方式。 – 2010-08-18 23:38:58
無論如何需要一點例外檢查。該Boolean.Parse()方法獲取一個字符串作爲參數,並返回要麼true
或false
只有的說法,一旦剝離出來空白的,等於「真」或「假」(注意大小寫)。在任何其他情況下,函數都會返回一個異常。
假設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
}
根據MSDN,Boolean.Parse是不區分大小寫的。這將是一個很好的使用Boolean.TryParse而不是Boolean.Parse來避免必須進行異常處理的地方。 – 2010-08-18 23:15:44
什麼是Boolean.True,即使它是有效的,再次將它與布爾值進行比較的優點是什麼?這可以永遠持續下去:'= Boolean.True == staff.getValue(「Female」)== true == true == true ...... == true'。重點是什麼? – 2010-08-18 23:50:29
您不是「檢查例外」。你在「吞噬異常,讓那些繼承你的代碼的人扯掉他們的頭髮。」這正是與例外無關的事情;如果解析布爾值可能會失敗,請使用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
如果只有一個應該是真的,那麼它是:
var male = bool.Parse(staff.getValue("Male"));
var female = bool.Parse(staff.getValue("Female"));
if (male^female)
{
//is true
}
要指定性別是否與「真」的值指定,而不是「假」,
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"));
注意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"
}
這是一個類似的情況,但我檢查了三個或更多的布爾值。
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();
你是說至少有一個值是真的,或者其中的一個值是真的? – mdma 2010-08-18 22:48:35
不會「是男還是女」永遠是真的嗎?無論如何,在地球上? – Ray 2010-08-18 22:49:15
@射線,如果有變性或「不想回答」選項會怎樣? – 2010-08-18 22:50:24