C# 编译器是否能够优化像 someEnumerable.Count() < 2 这样的语句?

Ted*_*erg 5 c# clr cil compiler-optimization

假设我有这样的代码:

if (someEnumerable.Count() < 2) {
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

这是否会导致someEnumerable完全迭代,或者如果Count()到达可枚举中的第二项,评估是否会完成?

Tim*_*ter 5

对于方法的行为没有编译器优化。如果有的话,这将是方法本身的运行时优化。但由于Enumerable.Count不知道它在哪个上下文中使用,它无法改变它的行为。

如果您不想计算某些内容而只是想知道是否有不超过一次的用途:

if (!someEnumerable.Skip(1).Any()) {
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果someEnumerable正在实现ICollection<TSource>or ICollection(如数组、列表或字典),则该方法被优化为仅使用该Count属性,因此不需要枚举所有项目(source)。那么这将是一个微观优化,会损害可读性,我可能更喜欢Count() < 2