До Linq мы обычно использовали следующий метод для определения, является ли коллекция непустой, то есть коллекция содержит элементы:
Используя атрибут Длина или Количество, с описанным выше нет проблем.
Но в эпоху Linq метод расширения Enumerable.Count «унифицировал» свойства Length и Count, что привело к следующему способу записи для оценки ненулевости:
Эта запись работает нормально и нормально, но может вызвать серьёзные проблемы с производительностью.
Обратите внимание, что это возможно, но не обязательно, и если вышеуказанный метод будет передан в виде <T>массива, списка или <T>коллекции, проблем не возникнет.
Так когда же что-то пойдёт не так? Рассмотрим следующие методы:
Когда его вызывают:
Скорость выполнения будет довольно низкой, и мой компьютер запустил исходный код примерно за 70 секунд. Count() > 0。
Если проанализировать, то обнаружите, что yield return i в строке 5 кода GetNums выполняется int. MaxValue, это обязательно?
На самом деле, если мы возвращаем один элемент, можно сделать вывод, что множество не пусто, и нет необходимости возвращать все элементы.
Так как же судить? Мы можем использовать метод Enumerable.Any extension:
Модифицируйте метод SomeAction следующим образом:
Позвоните ещё раз — и вы обнаружите, что время исполнения незначительно.
В итоге, Count() > 0 неизбежно столкнётся с проблемами с производительностью при возвращении yeild.
|