错失使用 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
程序员经常需要检查给定序列的所有元素是否都满足某个谓词。一种常见的模式是创建一个标志,然后遍历序列,如果正在检查的元素不满足谓词,则更改标志并跳出循环。
建议¶
这种模式效果很好,并且在 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));
}
}