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