错失使用 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
经常会看到循环立即从其迭代变量计算值,然后在循环的其余部分不再使用该迭代变量(请参见下面的示例)。此类循环的目的可以说根本不是迭代原始序列,而是迭代以某种方式转换原始序列的结果序列。
建议¶
如果明确表达了此意图,则代码的可读性会更高,这可以通过使用 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);
}
}
}
参考¶
MSDN:Enumerable.Select 方法。