CodeQL 文档

错失使用 Where 的机会

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

点击查看 CodeQL 存储库中的查询

程序员有时需要迭代序列的筛选版本,而不是序列本身。例如,您可能只想打印出 [1,10] 范围内偶数。实现此目的的一种标准方法是编写一个循环,该循环迭代整个序列,并在每次迭代时测试变量以确定其是否为偶数。这通常使用 if(!condition(var)) continue; 作为循环中的初始语句,或使用 if(condition(var)) 包围整个循环体来编写。

建议

此模式效果很好,并且在 C# 3.5 及更高版本中也作为 LINQ 中的 Where 方法提供。除非您有特定需求需要自定义版本,否则最好使用库方法而不是编写自己的模式。特别是,通过更好地表达意图和减少代码的嵌套深度,这使得代码更易于阅读。

示例

此示例展示了两种迭代一系列整数并仅对偶数执行操作的方法。

class MissedWhereOpportunity
{
    public static void Main(string[] args)
    {
        List<int> lst = Enumerable.Range(1, 10).ToList();

        foreach (int i in lst)
        {
            if (i % 2 != 0)
                continue;
            Console.WriteLine(i);
            Console.WriteLine((i / 2));
        }

        foreach (int i in lst)
        {
            if (i % 2 == 0)
            {
                Console.WriteLine(i);
                Console.WriteLine((i / 2));
            }
        }
    }
}

使用 Where 方法可以更好地表达这一点。

class MissedWhereOpportunityFix
{
    public static void Main(string[] args)
    {
        List<int> lst = Enumerable.Range(1, 10).ToList();

        foreach (int i in lst.Where(e => e % 2 == 0))
        {
            Console.WriteLine(i);
            Console.WriteLine((i / 2));
        }
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私