CodeQL 文档

错失使用 Select 的机会

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

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

经常会看到循环立即从其迭代变量计算值,然后在循环的其余部分不再使用该迭代变量(请参见下面的示例)。此类循环的目的可以说根本不是迭代原始序列,而是迭代以某种方式转换原始序列的结果序列。

建议

如果明确表达了此意图,则代码的可读性会更高,这可以通过使用 LINQ 对输入序列执行 Select 来完成。由于更好地分离了关注点,因此生成的代码更清晰。

示例

此示例迭代 i2 的列表。

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

        foreach (int i in lst)
        {
            int j = i * i;
            Console.WriteLine(j);
        }
    }
}

通过使用带有 lambda 表达式的 LINQ Select 方法可以更好地表达这一点。

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

        foreach (int j in lst.Select(i => i * i))
        {
            Console.WriteLine(j);
        }
    }
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私