我最初有以下代码:
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>
示例问题
第一次迭代
第二次迭代
因此,为了解决这个问题,我将代码更改为:
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?
正确的行为
第一次迭代
第二次迭代
很抱歉,如果这仍然令人困惑。如有必要,我可以解释一下。
编辑:现在我想起来我真的不需要'? 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;
}
}
答案 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
,去图)