2011-05-03 131 views
0

我有一个函数,如果所有项都通过了测试,它应该返回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

做所有的测试需要运行,或者你可以跳过其余的一个,一旦他们变成'假'? – Jon 2011-05-03 16:46:22

+0

@Jon:所有的测试都应该通过,甚至一次或全部失败。这就是为什么我没有使用'break'。 – Xaqron 2011-05-03 16:47:38

+1

顺便说一下,你发布的代码是错误的:如果任何次数的测试失败,只要最后一次通过,它就会返回'true'。 – Jon 2011-05-03 16:48:15

回答

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(); 
} 
+0

问题是,如果Items集合中没有项目,它应返回false – Xaqron 2011-05-03 16:55:46

+0

@Xaqron:我已更新答案。 – Jon 2011-05-03 17:01:58

+0

你也可以做'Items.Any()&& Items.All(Test)'?它会首先失败,但如果所有项目都是正确的,则通过? – 2011-05-03 20:13:00

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

这不会运行所有的测试(MSDN:'只要确定结果就停止源的枚举')。 – Matt 2011-05-03 16:51:21

+0

@Mat我已更新 – 2011-05-03 16:52:17

+0

如果集合中没有任何项目,您的答案将返回“true”,它应该是“false”。 – Xaqron 2011-05-03 17:01:47

0

好像它应该返回false如果只有一个项目失败,一个奇怪的要求。我是否正确地阅读问题?如果是这样你可以使用下面的

private bool TestAll() { 
    int failCount = 0; 
    foreach (var item in Items) { 
    if (!Test(item)) { 
     failCount++; 
    } 
    } 
    return failCount != 1; 
} 
0
private bool TestAll() 
{ 
    foreach (var item in Items) 
    { 
     if(!(Test(item)) || Items.Count == 0) 
     { 
      return false; 
     } 
    } 

return true; 
} 
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; 
} 
1

我知道这已被回答,最短的答案是LINQ答案。与其他类似,但它需要一秒钟的思想:

private bool TestAll() 
{ 
    var passed = true; 

    foreach (var item in Items) 
    { 
     if (! Test(item)) 
     { 
      passed = false; 
     } 
    } 

    return passed && Items.Count != 0; 
} 
+0

您的解决方案不会为所有需要的项目调用“测试”方法。 – Xaqron 2011-05-03 18:13:03

+0

刚刚看到第二条评论,你回复我点击编辑:)。 – pickypg 2011-05-03 18:13:47