错失使用 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
程序员有时需要迭代序列的筛选版本,而不是序列本身。例如,您可能只想打印出 [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));
}
}
}
参考¶
MSDN:Enumerable.Where 方法。