2010-12-10 13 views

Odpowiedz

11

Sądząc po spojrzeniu na kod za pomocą Reflektora, musiałbym powiedzieć "nie".

Kod kończy się skonstruowaniem instancji klasy generującej metodę iteratora, niezależnie od tego, jaki typ ją podajesz.

Problem ten komplikuje również fakt, że można określić obiekty porównywania zarówno dla zestawu Hashset, jak i Distinct, co oznacza, że ​​optymalizacja będzie używana tylko w bardzo niewielu przypadkach.

Na przykład, w następującym przypadku może to faktycznie optymalizacji połączenia z dala, ale nie będzie w stanie wiedzieć, że:

var set = new HashSet<int>(new MyOwnInt32Comparer()); 
var distinct = set.Distinct(new MyOwnInt32Comparer()); 

Ponieważ daję dwie instancje klasy comparer, a takie klasy zwykle nie implementują metod równości, metoda Distinct nie miałaby żadnej wiedzy, że te dwie implementacje porównywarek są w rzeczywistości identyczne.

W każdym przypadku jest to przypadek, w którym programista wie więcej o kodzie niż środowisko wykonawcze, więc skorzystaj z niego. Linq może być bardzo dobry, ale nie jest wszechmocny, więc wykorzystaj swoją wiedzę na swoją korzyść.

+0

Dzięki za opracowanie. – nothrow

2

Myślę, że nie, ponieważ dane wejściowe klasy Enumerable dla odrębnej metody jest IEnumerable i nie ma nic szczególnego dla określenia go jest zestaw hash (więc nie rób nic).

2

Nie, patrząc na implementację w odbłyśniku, nie sprawdza, czy wyliczenie to HashSet<T>. Podstawowy iterator tworzy nowy zestaw i wypełnia go podczas wyliczania, więc narzut nie powinien być tak duży.

Powiązane problemy