我有一个函数,如果所有项都通过了测试,它应该返回true。如果只有一个项失败,则该函数应返回false。如果集合中没有项,则该函数应返回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;
}
如何仅使用一个if
变量将逻辑简化为一个 bool
语句?
答案 0 :(得分:6)
您可以使用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;
答案 1 :(得分:2)
如果所有测试都需要运行,你可以在没有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();
}
答案 2 :(得分:1)
我意识到这已经得到了解答,最简单的答案就是LINQ答案。与其他人类似,但需要一瞬间思考:
private bool TestAll()
{
var passed = true;
foreach (var item in Items)
{
if ( ! Test(item))
{
passed = false;
}
}
return passed && Items.Count != 0;
}
答案 3 :(得分:0)
似乎奇怪的要求是,如果只有一个项目失败,它应该返回false
。我正确地读了这个问题吗?如果是这样,您可以使用以下
private bool TestAll() {
int failCount = 0;
foreach (var item in Items) {
if (!Test(item)) {
failCount++;
}
}
return failCount != 1;
}
答案 4 :(得分:0)
private bool TestAll()
{
foreach (var item in Items)
{
if(!(Test(item)) || Items.Count == 0)
{
return false;
}
}
return true;
}
答案 5 :(得分:0)
这将运行所有测试,如果没有测试则返回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;
}