繁体   English   中英

简化 boolean 逻辑

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM