Jestem po prostu ciekawy .. Kiedy zadzwonię Distinct <>() (z Linq) na HashSet, robi .NET wiedzieć, że ten IEnumerable zawsze zawiera odrębny zestaw wartości, i optymalizuje to połączenie?Wywołanie Distinct <>() na HashSet <T>
Odpowiedz
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ść.
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).
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.
- 1. Czy .NET 4 ISet <> HashSet <> zastępuje NHibernate Iesi.Collections ISet, HashSet?
- 2. C# cała zawartość HashSet <string>
- 3. Korzyści z konwertowania listy <String> na HashSet <String> Java
- 4. Konwertuj zestaw HashSet <T> na tablicę w .NET
- 5. Konwertuj zestaw <Map.Entry <K, V>> na HashMap <K, V>
- 6. Wyświetlanie <<..>> = na wyjściu
- 7. <%# %> vs <%= %>
- 8. C# HashSet <T> wydajność wyszukiwania (w porównaniu do ObservableCollection <T>)?
- 9. Dlaczego program HashSet <T> nie implementuje IReadOnlyCollection <T>?
- 10. SortedList <>, SortedDictionary <> i Dictionary <>
- 11. Skąd HashSet <T> przechodzi w VS2012?
- 12. Konwertuj zestaw <Object> do kolekcji <String>
- 13. convert <vector><string> TO <vector><int> C++, Win32
- 14. HashSet <T> w systemie Windows Phone 7
- 15. Zawiera z HashSet <Integer> w Pythonie
- 16. ASP.NET <%= %> vs <%: %>
- 17. IEnumerable <> to IList <>
- 18. Szyny ERB <%- ... -%> vs. <% ... %>
- 19. <?> vs <T>
- 20. Nie można przekonwertować listy <KeyValuePair <...,...>> na IEnumerable <object>?
- 21. Jak przekonwertować IQueryable <T> na wyrażenie <Func <T, bool>>?
- 22. Zrób <br> zamiast <div></div> naciskając Enter na contentEditable
- 23. Jak przekonwertować wyrażenie <Func <T, bool>> na predykat <T>
- 24. Jak przekształcić zestaw danych <Tuple2 <String, DeviceData >> na Iterator <DeviceData>
- 25. Wyraźny operator na liście <string>
- 26. Czy wywołanie AsQueryable <T> jest bezpieczne "DbSet <T>"?
- 27. Jak przekonwertować SortedList na SortedList <>
- 28. # <UserSession: {: unauthorized_record => "<protected>"}>
- 29. Dziwny <<loop>> wyjątek w generowaniu macierzy
- 30. Jaka jest różnica między robi wektor <vector<T...>> i grafika <vector<T> ...>
Dzięki za opracowanie. – nothrow