假设我有这样的代码:
if (someEnumerable.Count() < 2) {
// Do something
}
这是否会导致
someEnumerable
被完全迭代,或者如果 Count()
到达可枚举中的第二项,评估就会完成吗?
对于方法的行为没有编译器优化。如果有的话,这将是方法本身的运行时优化。但由于
Enumerable.Count
不知道它在哪个上下文中使用,所以它无法改变它的行为。
如果您不想计数某些东西,而只是想知道是否有不超过一次的用途:
if (!someEnumerable.Skip(1).Any()) {
// Do something
}
但是,如果
someEnumerable
正在实现 ICollection<TSource>
(如数组、列表或字典),则该方法被优化为仅使用 Count
属性,因此不需要枚举所有项目(source)。那么这将是一个微观优化,会损害代码的可读性。