CodeQL 文档

错失使用 All 的机会

ID: cs/linq/missed-all
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - maintainability
   - language-features
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

程序员经常需要检查给定序列的所有元素是否都满足某个谓词。一种常见的模式是创建一个标志,然后遍历序列,如果正在检查的元素不满足谓词,则更改标志并跳出循环。

建议

这种模式效果很好,并且在 LINQ 中也作为 All 方法提供。除非您有特定需求需要自定义版本,否则最好使用库方法而不是编写自己的模式。特别是,这会使代码更易于阅读(意图表达得更清晰)、更短、更不容易出错且更易于维护。

示例

在此示例中,将迭代列表以检查每个元素是否都是偶数。

class MissedAllOpportunity
{
    public static void Main(string[] args)
    {
        List<int> lst = new List<int> { 2, 4, 18, 12, 80 };

        bool allEven = true;
        foreach (int i in lst)
        {
            if (i % 2 != 0)
            {
                allEven = false;
                break;
            }
        }
        Console.WriteLine("All Even = " + allEven);
    }
}

可以使用 LINQ All 方法以更简单的方式完成此操作。

class MissedAllOpportunityFix
{
    public static void Main(string[] args)
    {
        List<int> lst = new List<int> { 2, 4, 18, 12, 80 };

        Console.WriteLine("All Even = " + lst.All(i => i % 2 == 0));
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私