4

我最初有以下代码:

        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。


示例问题

第一次迭代

  1. timeFound 是真的
  2. 成功检查点为假
  3. row.Text 确实包含我想要的文本
  4. successCheckPoint 确实是假的
  5. 成功检查点设置为真

第二次迭代

  1. timeFound 是真的
  2. 成功检查点为真
  3. row.Text 不包含我想要的文本
  4. successCheckPoint 不为假
  5. 成功检查点设置为假

所以为了解决这个问题,我将代码更改为:

        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;
                }
            }                                

        }

这可以满足我的要求,但感觉应该有更好的方法来完成这种行为。有什么方法可以设置,一旦布尔值设置为真,它就不会在未来的迭代中变回假?


正确的行为

第一次迭代

  1. timeFound 是真的
  2. 成功检查点为假
  3. row.Text 确实包含我想要的文本
  4. successCheckPoint 确实是假的
  5. 成功检查点设置为真

第二次迭代

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

抱歉,如果这仍然令人困惑。如有必要,我可以多解释一点。


编辑:现在我考虑一下,我真的不需要'?此代码的 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;
            }

        }
4

3 回答 3

8

您可以使用OR 赋值运算符|=

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为假且b为真,则为a真。否则,a仍然为假。

于 2012-06-27T19:34:06.790 回答
6

只需使用 OR 运算符,如下所示:

bool failed = false;

failed |= CheckOne();
failed |= CheckTwo();
于 2012-06-27T19:33:56.810 回答
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如果任何行包含成功消息,则为真。failureCheckPoint如果任何行包含失败消息,则为真。

使其易于阅读有助于以后更容易调试。此外,这将功能拆分为小块。

不用担心循环多次。如果您在 100 个项目上循环一次并执行 3 个操作,则与在 100 个项目上循环 3 次并每次执行 1 个操作所花费的时间大致相同(1 * 100 * 3 == 3 * 100 * 1,看图)

于 2012-06-27T19:49:24.587 回答