【问题标题】:C# How do I check if one of two values is TRUE?C#如何检查两个值之一是否为TRUE?
【发布时间】:2010-08-18 22:46:25
【问题描述】:

这里的 C# 专家应该是一个简单的问题。

我基本上想检查一个值或另一个是否为 TRUE,代码如下:

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

这对吗?

谢谢

【问题讨论】:

  • “是男性还是女性”不会总是正确的吗?到底是在地球上吗?
  • @Ray,如果有变性或“不想回答”选项怎么办?
  • @Ray 这不再完全正确。
  • @Matt - 我住在中西部 - 我们这里没有这些选择

标签: c# boolean-logic


【解决方案1】:

如果 EXACTLY ONE 应该为真,那么它是:

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

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

【讨论】:

    【解决方案2】:

    听起来您正在寻找逻辑 OR。

    if(condition1 || condition2)
    {
    }
    

    【讨论】:

    • 问题中给出的代码已经使用了 one 逻辑 OR 运算符——|——尽管我同意使用短路几乎总是更可取|| 版本。
    • @LukeH | 不是逻辑或运算符。它是按位或运算符。
    • @Markos:不在 C# 中。对于Boolean 类型,运算符| 是非短路逻辑或运算符。
    • @Markos:来自 MSDN 文档:“对于 bool 操作数,| 计算其操作数的逻辑或” msdn.microsoft.com/en-us/library/kxszd0kx.aspx
    • @Gorpik 当然,对一位的按位运算实际上是非短路逻辑运算。
    【解决方案3】:

    使用||(双管道),逻辑或。

    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】:

      条件 OR 运算符 || 是您所需要的

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

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

      【讨论】:

      • 问题中的示例代码使用的 | 运算符也是逻辑 OR 运算符,尽管我同意使用短路的 || 版本几乎总是更可取的.
      • 我的错 - 我将其编辑为“有条件的”,因为这就是我看到它被调用的方式。
      【解决方案5】:

      请注意,TryParseParse 更快速、更安全,因为在发生错误时不会引发异常。 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"
      }
      

      【讨论】:

        【解决方案6】:

        表示性别是否指定为“真”而不是“假”,

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

        【讨论】:

          【解决方案7】:

          这是一个类似的场景,但我正在检查三个或更多布尔值。

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

          【讨论】:

            【解决方案8】:

            无论如何都需要进行一点异常检查。 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
            }
            

            【讨论】:

            • 根据 MSDN Boolean.Parse 不区分大小写。这将是使用 Boolean.TryParse 而不是 Boolean.Parse 以避免必须进行异常处理的好地方。
            • 什么是 Boolean.True,即使它是有效的,再次将它与布尔值进行比较有什么好处?这可能会永远持续下去:= Boolean.True == staff.getValue("Female") == true == true == true...... == true。有什么意义?
            • 您不是在“检查异常”。你“吞下了异常,让继承你的代码的人扯掉了头发”。这正是与异常无关的事情;如果解析布尔值可能会失败,请按照 Phil Lamb 的建议使用 TryParse()。如果找到一个空返回值只是意味着您将false 分配给isMale 或isFemale 无论如何,只需使用空合并运算符“??”。 msdn.microsoft.com/en-us/library/ms173224.aspx。即isMale = staff.getValue() ?? false;
            • 菲尔:完全同意!!!!迈克尔:错字,应该是:isMale = Boolean.TrueString == staff.getValue("Male"),而不是isMale = Boolean.True == staff.getValue("Male")。 jloubert:而不是 Boolean.Parse(staff.getValue() ?? Boolean.FalseString)(或使用 TryParse)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-06
            • 2022-03-30
            • 2014-02-02
            • 1970-01-01
            • 2022-01-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多