我最初有以下代码:
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。
示例问题
第一次迭代
第二次迭代
所以为了解决这个问题,我把代码改成了这样:
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 值设置为真,它就不会在以后的迭代中改回假?
正确行为
第一次迭代
第二次迭代
对不起,如果这仍然令人困惑。如有必要,我可以多解释一点。
编辑:现在我考虑一下,我真的不需要'吗?此代码的 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/