До Linq ми зазвичай використовували наступний метод для визначення, чи є колекція непорожньою, тобто колекція містить елементи:
За допомогою атрибута Довжина або Кількість немає проблем із наведеним вище письмом.
Але в епоху Лінк метод розширення Enumerable.Count «об'єднав» властивості Довжини та Count, що призвело до наступного способу оцінки ненульності:
Цей текст працює нормально, але може спричинити серйозні проблеми з продуктивністю.
Зверніть увагу, що це можливо, але не обов'язково, і якщо наведений вище метод передати як масив<T>, список або <T>колекцію, проблем не буде.
То коли ж щось піде не так? Розглянемо такі методи:
Коли викликають:
Швидкість виконання буде досить низькою, і мій комп'ютер запустив вихідний код приблизно за 70 секунд. Count() > 0。
Якщо проаналізувати, ви побачите, що yield return i у рядку 5 коду GetNums виконується int. MaxValue, чи це необхідно?
Насправді, якщо ми повертаємо один елемент, можна зробити висновок, що множина є непорожньою, і немає потреби повертати всі елементи.
То як же судити? Ми можемо використати метод Enumerable.Any Extension:
Модифікуємо метод SomeAction наступним чином:
Зателефонуйте ще раз — і ви побачите, що час виконання майже незначний.
Підсумовуючи, Count() > 0 неминуче матиме проблеми з продуктивністю, коли зустріне yeild return.
|