C# 如何检查两个值中是否有一个为 TRUE?

9

这对于C#专家来说应该是一个简单的问题。

我想要检查一个值或另一个值是否为TRUE,以下是可能的代码:

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

这个正确吗?

谢谢


6
“is male OR is female” 这个命题在地球上总是成立的,不是吗? - Ray
2
@Ray,如果有跨性别或“不想回答”的选项怎么办? - Matthew Olenik
3
@Ray 这不完全是真的了。 - NullUserException
2
@Matt - 我住在中西部地区 - 我们这里没有那些选项。 - Ray
1
@Ray 请查看http://language.home.sprynet.com/otherdex/22enuf.htm。 - NullUserException
显示剩余3条评论
8个回答

18

如果只有一个条件应该为真,则为:

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

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

10
听起来你需要逻辑或操作符。
if(condition1 || condition2)
{
}

问题中给出的代码已经使用了一个逻辑OR运算符--|--虽然我同意通常最好使用短路||版本。 - LukeH
4
@LukeH中的|不是逻辑或运算符,而是位或运算符。 - Markos
1
@Markos:不是C#。对于类型为Boolean的变量,运算符|是一个非短路逻辑或运算符。 - Gorpik
@Markos:来自 MSDN 文档: “对于布尔操作数,| 计算其操作数的逻辑或。” http://msdn.microsoft.com/zh-cn/library/kxszd0kx.aspx - LukeH
@Gorpik 当然,对一个位进行的按位操作实际上是非短路逻辑操作。 - Markos
@Markos:但是在C#中,正如LukeH的链接所解释的那样,这个运算符被明确定义为非短路逻辑运算符。这是一个概念问题。因此,你的第一条评论是错误的。 - Gorpik

8

使用 ||(双竖线)表示逻辑或。

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,则不会评估第二个表达式。

4
条件或运算符||是你需要的。
if ((Boolean.Parse(staff.getValue("Male")) || Boolean.Parse(staff.getValue("Female")))
{
   //is true
}

如果第一个条件为TRUE,那么第二个条件不会被检查,因为结果显然会返回TRUE

“|” 运算符,就像问题中的示例代码所示,也是一个逻辑或运算符,尽管我同意使用短路的 “||” 版本通常更可取。 - LukeH
对不起,我把它改成了“条件”,因为我见过人们这样称呼它。 - Eton B.

2
请注意,TryParse 比仅使用 Parse 更快且更安全,因为在出现错误时不会抛出异常。 TryParse 返回一个布尔值,表示解析是否成功。
因此,两种解析方法都应该返回 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
为了指示性别是否指定为“true”而不是“false”,
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")); 

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();

-3

无论如何都需要一些异常检查。Boolean.Parse() 方法接受一个字符串作为参数,并仅在该参数去除空格后等于 "True" 或 "False"(注意大小写)时返回 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
}

6
根据MSDN,Boolean.Parse不区分大小写。使用Boolean.TryParse会是一个不错的选择,因为它避免了需要处理异常的情况。请注意不要改变原文意思。 - Phil Lamb
3
什么是布尔值True?即使它是有效的,将其再次与布尔值进行比较有何优点?这可能会一直进行下去:= Boolean.True == staff.getValue("Female") == true == true == true...... == true。这有什么意义? - Michael Shimmins
1
你没有在"检查异常"。你正在"吞咽异常并让继承你代码的人抓狂"。这正是出现异常时不应该做的事情;如果解析布尔值可能会失败,请像菲尔·兰姆建议的那样使用TryParse()。如果发现null返回值只意味着将false赋给isMale或isFemale,那么只需使用null合并运算符"??". http://msdn.microsoft.com/en-us/library/ms173224.aspx。例如:`isMale = staff.getValue() ?? false;` - jloubert
Phil: 完全同意!!Michael: 打错字了,应该是:isMale = Boolean.TrueString == staff.getValue("Male") 而不是 isMale = Boolean.True == staff.getValue("Male)。jloubert: 更好的写法是 Boolean.Parse(staff.getValue() ?? Boolean.FalseString)(或者使用 TryParse)。 - rewritten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接