2010-03-12 8 views
12

Aquí está mi código:¿Sigue conectado un objeto a una lista después de FirstOrDefault?

 Event thisEvent = (from i in list 
          where (i.eventID == eventID) 
          select i).FirstOrDefault(); 
     if (thisEvent != null) 
     { 
      thisEvent.eventResolved = resolved; 
      thisEvent.eventSequence.Add(item); 
     } 

"lista" es una colección de IEnumerable, es decir

IEnumerable<Event> list; 

Lo que me pregunto es: después de crear thisEvent usando FirstOrDefault, se thisEvent sigue conectado a la lista? En otras palabras, cuando cambio las dos propiedades, eventResolved y eventSequence, ¿realmente se cambia "list", o thisEvent es solo una copia totalmente desconectada de un elemento en "list"?

Respuesta

13

FirstOrDefault selecciona un elemento en una colección, pero no "detatch" o "clonarlo". Es decir. es la misma instancia Entonces, si modifica una propiedad, modificará la instancia original.

Si desea "separar" el objeto tendrá que copiarlo de una forma u otra.

+2

Gracias! (blah de blah blah para llegar a 15 caracteres ...) – Cynthia

+0

Cynthia no pudo votarte (3 repeticiones). Estoy haciendo esto por ella =). –

2

La lista no ha cambiado y aún incluye el objeto devuelto por FirstOrDefault.

Esta es una regla general con todos los operadores LINQ: nunca modifican la colección fuente.

También tenga en cuenta que thisEvent no es una "copia" (a menos que Event sea un tipo de valor (struct) en lugar de una clase) - es una referencia al mismo objeto al que se hace referencia en list.

+0

Hmmmm ... pero si se trata de una referencia al mismo objeto, entonces la lista se cambiaría, ¿no es así? Al menos, en términos de ese objeto, no en términos de que algún elemento se haya agregado o eliminado de la lista. – Cynthia

+0

La * lista * no ha cambiado. Los mismos objetos todavía están en la lista después de llamar a FirstOrDefault(). Pero sí, es posible modificar una lista * elemento * a través de la referencia devuelta (nuevamente, suponiendo que Evento es una clase en lugar de una estructura). Esta es una característica de las referencias .NET, no de nada inherente a las listas o FirstOrDefault: de manera similar, si escribió 'Event thatEvent = thisEvent;', los cambios hechos al objeto a través de la referencia 'thatEvent' también se verían a través del' thisEvent 'referencia. Un objeto, referencias múltiples. – itowlson

+0

Difícilmente sucede lo mismo en este caso, pero para mayor información, eche un vistazo a esta pregunta (http://stackoverflow.com/questions/4052204/how-to-define-ienumerable-behavior- by-contract). Muestra un posible escenario en el que FirstOrDefault() parece desconectado (en realidad no lo era. Los elementos de IEnumerable se recrearon cuando el origen de IEnumerable era un "retorno de rendimiento"). – AntonioR

0

Si Event es un tipo de referencia, entonces sí, modificando thisEvent modificará el elemento en la lista.

Cuestiones relacionadas