简化布尔逻辑

时间:2011-05-03 16:44:49

标签: c# logic boolean

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

6 个答案:

答案 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;
}