这里应该是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