Hace LINQ realmente realizar una copia profunda de los resultados a una lista/matriz/etc diferente, o simplemente me da una lista/matriz/etc. compuesto de referencias al original?¿Nueva memoria LINQ al crear devoluciones
Respuesta
Va a depender de si (y cómo) usar Seleccionar para proyectar los resultados.
Si no crea objetos nuevos en una proyección, el resultado hará referencia a los mismos objetos que la colección original.
Sin embargo, si crea objetos nuevos en el proyecto, obviamente no serán lo mismo.
La colección devuelta aquí contendrá referencias a los mismos objetos en _myCollection
:
from m in _myCollection
where m.SomeFilterCriteria
select m
Las colecciones devueltos en estos casos no podrá:
from m in _myCollection
where m.SomeFilterCriteria
select new { m.Prop1, m.Prop2 }
En este caso, vale la pena señalar esa Prop1 y Prop2 del nuevo objeto anónimo - si son tipos de referencia - contendrán una referencia al objeto same como el objeto original. Solo las referencias de nivel superior en la colección serán diferentes.
Básicamente, nada en .Net aparte de los serializadores (como se menciona en otra parte) será una copia "profunda", a menos que lo implemente.
o
from m in _myCollection
where m.SomeFilterCriteria
select m.Clone()
Una vez más, sería un error suponer que cualquier copia "profunda" está pasando aquí. Por supuesto, la implementación de Clone
estará en la clase y podría ser cualquier cosa, incluida la copia profunda, pero eso no se da.
En su último ejemplo, pensé 'Clone()' solo realizó una copia superficial. –
Clone copiará sin embargo fue implementado para hacerlo. No hay un clon predeterminado: debe implementarlo para cualquier objeto sobre el que desee admitirlo. Mi respuesta solo habla de las referencias de nivel superior en la colección. Nada de copias "profundas" en .Net. –
@Joel B: para agregar al comentario de qstarin, el [artículo de MSDN] (http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx) establece explícitamente que "Clone se puede implementar ya sea como una copia profunda o una copia superficial. "Por lo tanto, no solo se copiará el clon sin embargo se implementó para hacerlo, sino que la copia superficial y profunda son ** ambas ** implementaciones permitidas según la documentación de MSDN. Curiosamente, object tiene un miembro protegido [MemberwiseClone] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) para hacer copias superficiales. – Brian
Lo que devuelve depende mucho del método LINQ al que se refiera. Pero con la excepción de los pocos métodos que copian explícitamente la enumeración (ToList
y ToArray
por ejemplo), el patrón general es no copiar la entrada a una nueva estructura. En cambio, prefiere la evaluación perezosa.
Si vuelve a leer la pregunta, encontrará que ToList() y ToArray() no son especiales. :) – bzlm
@bzlm, no estoy seguro de cómo la pregunta está relacionada con esa parte de mi respuesta. Quise llamarlos específicamente como 2 métodos LINQ que evalúan ansiosamente la entrada y producen una nueva estructura de colección antes de hacer una declaración más amplia sobre el resto. No dije que hiciera una copia profunda, así que no estoy seguro de a qué se refiere. – JaredPar
@JaredPar La pregunta es "LINQ realmente realiza una copia [...] profunda o simplemente me da una lista [...] compuesta de referencias al original". Su respuesta es si las * enumeraciones * son evaluadas. ¿Derecha? – bzlm
LINQ realmente realiza una copia profunda de los resultados a una lista/matriz/etc diferente, o simplemente me da una lista/matriz/etc. compuesto de referencias al original?
De Enumerable.ToArray. (Texto Imagen similar al encontrado Enumerable.ToList)
El ToArray (IEnumerable) fuerzas método de evaluación de la consulta inmediata y devuelve una matriz que contiene los resultados de la consulta. Puede agregar este método a su consulta para obtener una copia en caché de los resultados de la consulta.
Bueno, eso ciertamente parece confuso.
- devuelve una matriz que contiene los resultados de la consulta
- obtener una copia en caché de la consulta resulta
Desde la primera frase, está claro que no se realizan copias de artículos en la consulta.
De la segunda oración, obtiene una copia de los resultados de la consulta como un todo, pero esa es una copia superficial desde no se hacen copias de los elementos en la consulta.
- 1. DatatypeConfigurationException al crear nueva XMLGregorianCalendar
- 2. Sin memoria al crear muchos objetos C#
- 3. Uso de la memoria en .NET al crear una nueva clase o estructura
- 4. Rendimiento LINQ en memoria
- 5. Eclipse: crear nueva actividad
- 6. Fuga de memoria de JavaFX 2.0 al crear escenas múltiples
- 7. crear nueva sqlite Db
- 8. Lista de devoluciones con conteo máximo usando Linq
- 9. ¿Por qué hacer DUP al crear una nueva instancia?
- 10. LINQ seleccionar nueva clase con un nombre
- 11. ¿Evita las pérdidas de memoria en las devoluciones de llamada?
- 12. devolviendo la memoria alineada con la nueva?
- 13. Cantidad de uso de memoria al crear subprocesos Java
- 14. LINQ distinta y seleccione nueva consulta
- 15. ¿Cómo crear una nueva carpeta?
- 16. Insertar en crear nueva tabla
- 17. Crear nueva excepción en C++
- 18. Cómo crear nueva propiedad dinámicamente
- 19. Crear nueva vista de contactos
- 20. Crear nueva ventana utilizando jquery
- 21. ¿Cómo crear devoluciones de llamada dinámicas en MATLAB?
- 22. httpservletrequest - crear nueva sesión/cambiar sesión Id
- 23. Crear objetos en la memoria preasignada
- 24. Diseñar devoluciones de llamada
- 25. ¿Cómo evito una pérdida de memoria con LINQ-To-SQL?
- 26. ¿Es posible crear una nueva propiedad css?
- 27. Android - Crear una nueva actividad en Eclipse
- 28. Crear nueva instancia EC2 con ISO personalizada
- 29. ¿Cómo crear una nueva figura en MATLAB?
- 30. Crear nueva acción de rieles no funciona?
Nada en .NET, excepto quizás la serialización, crea automáticamente una copia profunda de cualquier cosa. Una de las razones es que las copias profundas no son triviales para construir automáticamente. – bzlm
@bzlm - entonces cuando edito el resultado de una consulta LINQ, ¿estoy editando el valor del miembro de la colección original? –
Sí, lo eres. Intentalo. :) – bzlm