Как наивный отзыв, вы часто слышите, что используете IEnumerable.Any(), потому что тогда все перечислимое необязательно нужно пройти.Будет ли компилятор оптимизировать сравнение с IEnumerable <T> .Count()?
Я написал небольшой сегмент кода, который пытается увидеть, содержит ли перечисляемый элемент один или несколько элементов.
if (reportInfo.OrebodyAndPits.SelectMany(ob => ob.Pits).Count() > 1)
{
ws.Cells[row, col++].Value = "Pits";
}
else
{
ws.Cells[row, col++].Value = "Pit";
}
Это заставило меня задаться вопросом, будет сравнение составляться в форме, достаточно умны, чтобы вернуться ложным, как только он перебирает мимо первого пункта?
Если нет, существует ли способ написать метод расширения linq, который бы это сделал?
(Пожалуйста, обратите внимание, что я не очень заинтересован в производительности от этого куска кода. Я в основном любопытно.)
Нет, '.Count()' возвращает количество элементов, например. '123456789' и только тогда проверьте состояние'> 1'. Поместите 'Skip (1) .Any()' для умного поведения. В некоторых случаях (это одно исключено *) .Net видит, что 'IEnumerable' на самом деле является * массивом * 'T []' или * list * 'List ' и вызывать 'Length' или' Count' вместо перемещения , но это все, чего мы можем ожидать –