作爲一個幼稚的提示,您經常會聽到使用IEnumerable.Any(),因爲那麼整個枚舉不一定需要遍歷。編譯器是否會優化與IEnumerable <T> .Count()的比較?
我只寫了一小段代碼,試圖查看Enumerable是否包含單個項目或多個項目。
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'實際上是一個* array *'T []'或* list *'List '並且調用'Length'或'Count'而不是遍歷,但這就是我們所能預料的所有 –