如何使布尔表现得像'闩锁'?

时间:2012-06-27 19:31:57

标签: c# boolean

我最初有以下代码:

        Boolean successCheckPoint = false;
        Boolean failureCheckPoint = false;
        Boolean timeFound = false;

        foreach (var row in auditRows)
        {
            timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2) ? true : false;

            if (timeFound)
            {
                successCheckPoint = row.Text.Contains("Web User Login Success") && !successCheckPoint ? true : false;
                failureCheckPoint = row.Text.Contains("Web User Login Failure") && !failureCheckPoint ? true : false;
            }                                

        }

但是我发现在foreach的后续迭代中,即使successCheckPoint或failureCheckPoint布尔值设置为true,由于我设置赋值的方式,它们最终会被设置为false。 / p>


示例问题

第一次迭代

  1. timeFound是真的
  2. successCheckPoint为false
  3. row.Text包含我想要的文字
  4. successCheckPoint确实是假的
  5. successCheckPoint设置为true
  6. 第二次迭代

    1. timeFound是真的
    2. successCheckPoint是真的
    3. row.Text不包含我想要的文字
    4. successCheckPoint不是假的
    5. successCheckPoint设置为false

    6. 因此,为了解决这个问题,我将代码更改为:

              Boolean successCheckPoint = false;
              Boolean failureCheckPoint = false;
              Boolean timeFound = false;
      
              foreach (var row in auditRows)
              {
                  timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2) ? true : false;
      
                  if (timeFound)
                  {
                      if (!successCheckPoint)
                      {
                          successCheckPoint = row.Text.Contains("Web User Login Success") ? true : false;
                      }
      
                      if (!failureCheckPoint)
                      {
                          failureCheckPoint = row.Text.Contains("Web User Login Failure") ? true : false;
                      }
                  }                                
      
              }
      

      这就是我想要的,但感觉应该有更好的方法来完成这种行为。有没有办法设置,以便一旦布尔值设置为true,它将不会在以后的迭代中变回false?


      正确的行为

      第一次迭代

      1. timeFound是真的
      2. successCheckPoint为false
      3. row.Text包含我想要的文字
      4. successCheckPoint确实是假的
      5. successCheckPoint设置为true
      6. 第二次迭代

        1. timeFound是真的
        2. successCheckPoint为真,所以跳过重新评估

        3. 很抱歉,如果这仍然令人困惑。如有必要,我可以解释一下。


          编辑:现在我想起来我真的不需要'? true:false'此代码的部分。

          新守则:

                  Boolean successCheckPoint = false;
                  Boolean failureCheckPoint = false;
                  Boolean timeFound = false;
          
                  foreach (var row in auditRows)
                  {
                      timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2);
          
                      if (timeFound)
                      {
                          if (!successCheckPoint)
                          {
                              successCheckPoint = row.Text.Contains("Web User Login Success");
                          }
          
                          if (!failureCheckPoint)
                          {
                              failureCheckPoint = row.Text.Contains("Web User Login Failure");
                          }
                      }                                
          
                  }
          

          感谢大家的帮助!这是我已经解决的代码版本:

                  Boolean successCheckPoint = false;
                  Boolean failureCheckPoint = false;
                  Boolean timeFound = false;
          
                  foreach (var row in auditRows)
                  {                            
                      if (row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2))
                      {
                          successCheckPoint |= row.Text.Contains("Web User Login Success");
                          failureCheckPoint |= row.Text.Contains("Web User Login Failure");
                      }
          
                      if (successCheckPoint && failureCheckPoint)
                      {
                          break;
                      }
          
                  }
          

3 个答案:

答案 0 :(得分:8)

您可以使用OR assignment operator |=

bool successCheckPoint = false;
bool failureCheckPoint = false;

foreach (var row in auditRows)
{
    if (row.Text.Contains(sCurrentTime) ||
        row.Text.Contains(sLenientTime) ||
        row.Text.Contains(sLenientTime2))
    {
        successCheckPoint |= row.Text.Contains("Web User Login Success");
        failureCheckPoint |= row.Text.Contains("Web User Login Failure");
    }                                
}

a |= b;a = a | b;的缩写。因此,如果a已经为真,那么它仍然是正确的。如果a为false且b为true,则a成立。否则,a仍为假。

答案 1 :(得分:6)

只需使用OR运算符,如:

bool failed = false;

failed |= CheckOne();
failed |= CheckTwo();

答案 2 :(得分:1)

我并不喜欢其他答案,因为他们过于复杂化了这段代码。我觉得linq有助于提高代码的可读性:

var rows = auditRows.Where(TimeIsFound);
var successCheckPoint = rows.Any(RowContainsSuccess);
var failureCheckPoint = rows.Any(RowContainsFailure);

...elsewhere...

static bool TimeIsFound(SomeType row)
{
    return row.Text.Contains(sCurrentTime) ||
           row.Text.Contains(sLenientTime) ||
           row.Text.Contains(sLenientTime2);
}
static bool RowContainsSuccess(SomeType row)
{
    return row.Text.Contains("Web User Login Success");
}
static bool RowContainsFailure(SomeType row)
{
    return row.Text.Contains("Web User Login Failure");
}

我觉得这会让代码更容易理解,它几乎变成了一个段落:

  

获取找到某些特定时间的行。如果任何行包含成功消息,则successCheckPoint为true。如果任何行包含失败消息,则failureCheckPoint为真。

易于阅读有助于以后更容易调试。此外,这将功能分成一口大小的块。

不要担心多次循环。如果你循环超过100个项目并执行3个动作,则大约需要在100个项目上循环3次并每次执行1个动作(1 * 100 * 3 == 3 * 100 * 1,去图)