Solo tengo curiosidad .. Cuando llamo Distinct <>() (desde Linq) en HashSet, ¿sabe .NET que este IEnumerable siempre contiene un conjunto de valores distintos, y optimiza esta llamada de distancia?Llamando a Distinct <>() en HashSet <T>
Respuesta
A juzgar por mirar el código a través de Reflector, tendría que decir que no.
El código termina construyendo una instancia de una clase generada por el método iterador, independientemente del tipo que le dé.
Este problema también se ve agravado por el hecho de que puede especificar objetos comparadores para Hashset y el método Distinct, lo que significa que la optimización solo se usará en muy pocos casos.
Por ejemplo, en el siguiente caso que en realidad podría optimizar la llamada de distancia, pero no sería capaz de saber que:
var set = new HashSet<int>(new MyOwnInt32Comparer());
var distinct = set.Distinct(new MyOwnInt32Comparer());
Desde que se dé dos instancias de la clase comparador y tal Por lo general, las clases no implementan métodos de igualdad, el método Distinct no tendría forma de saber que las dos implementaciones del comparador son realmente idénticas.
En cualquier caso, este es un caso en el que el programador sabe más sobre el código que el tiempo de ejecución, así que aprovéchelo. Linq puede ser muy bueno, pero no es omnipotente, así que utiliza tus conocimientos para tu ventaja.
Creo que no, porque la entrada de la clase Enumerable para el método distinto es IEnumerable y no hay nada específico para determinar que es un conjunto hash (por lo tanto, no haga nada).
No, mirando la implementación en reflector, no comprueba si la enumeración es HashSet<T>
. El iterador subyacente crea un nuevo conjunto y lo rellena durante la enumeración, por lo que la sobrecarga no debería ser tan grande.
- 1. SortedSet <T> vs HashSet <T>
- 2. Can .NET 4 ISet <> HashSet <> replace NHibernate Iesi.Collections ISet, HashSet?
- 3. Convierta una matriz a HashSet <T> en .NET
- 4. Conversión de HashSet <String> a Cadena []
- 5. C# HashSet <T> rendimiento de búsqueda (en comparación con un ObservableCollection <T>)?
- 6. ¿Por qué HashSet <T> no implementa IReadOnlyCollection <T>?
- 7. Preguntas sobre IEqualityComparer <T>/List <T> .Distinct()
- 8. HashSet <T> en Windows Phone 7
- 9. ¿Cuándo debo usar el tipo HashSet <T>?
- 10. incluyendo <xstring>, <cstring>, <string> y <wstring> en C++
- 11. Type.GetType(), HashSet <T> y la Asamblea Calificación
- 12. Expresión <Func <TModel, string >> a Expression <Acción <TModel>> "Getter" a "Setter"
- 13. ¿Es Enumerable.ElementAt <TSource> O (1) para HashSet?
- 14. <%# %> vs <%= %>
- 15. C todo el contenido de HashSet <string>
- 16. ¿Por qué es HashSet <T> .IsReadOnly explícito?
- 17. <noscript> en <head>
- 18. <script></script> o <script />?
- 19. SortedList <>, SortedDictionary <> y Dictionary <>
- 20. XSD Formateo <element><complexType> vs <complexType /><element/>
- 21. Depuración visual utilizando >>,>,> |, ||, | <, <, <<
- 22. IList <T> a IQueryable <T>
- 23. Cómo deserializar Enumerable.ToList <>() a la lista <>
- 24. moldeada IQueryable <EntityObject> a IQueryable <Specific>
- 25. convertir IQueryable <int> a <int>
- 26. IList <T> a ObservableCollection <T>
- 27. AutoMapper: Copiar IList <> a IList <>
- 28. ¿Cuál es el significado de los corchetes angulares en los métodos LINQ en Intellisense? (Contiene <>, Count <>, Distinct <>, etc.)
- 29. ASP.NET <%= %> vs <%: %>
- 30. : <span> vs <label>
Gracias por su elaboración. – nothrow