我最初有以下代码:

        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 boolean 值已设置为 true,由于我设置分配的方式,它们最终也会设置为 false。

示例问题

第一次迭代
  • timeFound 是真的
  • successCheckPoint 为假
  • row.Text确实包含我想要的文本
  • successCheckPoint 确实是假的
  • successCheckPoint 设置为 true

  • 第二次迭代
  • timeFound 是真的
  • successCheckPoint 为真
  • row.Text 不包含我想要的文本
  • successCheckPoint 不是假的
  • successCheckPoint 设置为 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) ? 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;
                    }
                }
    
            }
    

    这是我想要的,但是感觉应该有一种更好的方法来完成这种行为。有什么方法可以设置,一旦 boolean 值设置为真,它就不会在以后的迭代中改回假?

    正确行为

    第一次迭代
  • timeFound 是真的
  • successCheckPoint 为假
  • row.Text 确实包含我想要的文本
  • successCheckPoint 确实是假的
  • successCheckPoint 设置为 true

  • 第二次迭代
  • timeFound 是真的
  • successCheckPoint为true,因此跳过重新评估


  • 对不起,如果这仍然令人困惑。如有必要,我可以多解释一点。

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

    最佳答案

    您可以使用 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变为true。否则,a 仍为假。

    关于c# - 如何使 Boolean 表现得像 'latch' ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11233628/

    10-08 21:33