2010-08-18 62 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(); 
相关问题