作为一个最基本的技巧,你经常听说要使用IEnumerable.Any()方法,因为这样不需要必须遍历整个可枚举对象。
我刚写了一小段代码来检查可枚举对象是否只包含一个元素或多个元素。
if (reportInfo.OrebodyAndPits.SelectMany(ob => ob.Pits).Count() > 1)
{
ws.Cells[row, col++].Value = "Pits";
}
else
{
ws.Cells[row, col++].Value = "Pit";
}
这让我想到,比较是否会编译成一种足够聪明的形式,只要枚举到第一个项之后就返回false呢?
如果不是,有没有一种方法可以编写linq扩展方法来实现这个功能呢?
(请注意,我对此代码片段的性能影响并不是特别感兴趣。我主要是好奇。)
.Count()
返回项目数量,例如123456789
,然后才检查> 1
条件。对于智能行为,请使用Skip(1).Any()
。在某些情况下(本例除外),.Net 看到IEnumerable<T>
实际上是 数组T[]
或 列表List<T>
,并调用Length
或Count
而不是遍历,但这就是我们所能期望的了。 - Dmitry Bychenko