[英]Simplifying a boolean logic
我有一个 function 如果所有项目都通过测试,它应该返回 true。 如果只有一项失败,则 function 应返回 false。 如果集合中没有项目,则 function 应该返回 false。 这是代码:
private bool TestAll()
{
bool finalResult = false;
bool itemResult = false;
foreach (var item in Items)
{
itemResult = Test(item);
if (!finalResult && itemResult)
finalResult = true;
else if (finalResult && !itemResult)
finalResult = false;
}
return finalResult;
}
如何仅使用一个bool
变量将逻辑简化为一个if
语句?
您可以使用IEnumerable.All
扩展方法来测试所有项目,这会在Test
方法失败的第一个实例上失败。
private bool TestAll()
{
return Items.All(Test);
}
如果您仍然需要测试所有项目,您可以使用 AND 赋值运算符:
if (!Items.Any()) return false;
bool result = true;
foreach (var item in Items)
{
result &= Test(item);
}
return result;
如果所有的测试都需要运行,你可以在没有 LINQ 的情况下这样做:
private bool TestAll()
{
var allTestsPassed = true;
foreach (var item in Items)
{
allTestsPassed = Test(item) && allTestsPassed;
}
return allTestsPassed;
}
您可以使用 LINQ 来执行此操作:
private bool TestAll()
{
return Items.Count(Test) == Items.Count();
}
更新:如果没有要运行的测试,则返回false
private bool TestAllWithoutLinq()
{
if (Items.Count == 0) { // or something equivalent
return false;
}
var allTestsPassed = true;
foreach (var item in Items)
{
allTestsPassed = Test(item) && allTestsPassed;
}
return allTestsPassed;
}
private bool TestAllWithLinq()
{
return Items.Any() && Items.Count(Test) == Items.Count();
}
我意识到这已经得到回答,最短的答案是 LINQ 答案。 与其他人类似,但它需要一瞬间的思考:
private bool TestAll()
{
var passed = true;
foreach (var item in Items)
{
if ( ! Test(item))
{
passed = false;
}
}
return passed && Items.Count != 0;
}
如果只有一个项目失败,它应该返回false
似乎是一个奇怪的要求。 我是否正确阅读了这个问题? 如果是这样,您可以使用以下内容
private bool TestAll() {
int failCount = 0;
foreach (var item in Items) {
if (!Test(item)) {
failCount++;
}
}
return failCount != 1;
}
private bool TestAll()
{
foreach (var item in Items)
{
if(!(Test(item)) || Items.Count == 0)
{
return false;
}
}
return true;
}
这将运行所有测试,如果没有测试则返回 false,并且仅当所有测试都通过时才返回 true:
private bool TestAll() {
if (Items.Count == 0) return false;
bool passed = true;
foreach(var item in Items) {
if (!Test(item))
passed = false;
}
return passed;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.