2010-03-12 3 views
12

여기 내 코드입니다 :개체가 FirstOrDefault 뒤에 여전히 목록에 연결되어 있습니까?

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

"목록"을 IEnumerable의 집합, 즉이다 내가 궁금하네요 무엇

IEnumerable<Event> list; 

: thisEvent는, thisEvent은 여전히 ​​목록에 연결되어 FirstOrDefault를 사용하여 만든 후? 즉, 두 속성, eventResolved 및 eventSequence를 변경하면 "list"가 실제로 변경되었거나 thisEvent는 "list"에서 항목의 완전히 연결이 끊긴 복사본입니까?

답변

13

FirstOrDefault은 컬렉션에서 항목을 선택하지만이를 "디텍트"또는 "복제"하지 않습니다. 나는. 그것은 같은 경우입니다. 따라서 속성을 수정하면 원래 인스턴스가 수정됩니다.

개체를 "분리"하려면 개체를 어떤 방식 으로든 복사해야합니다.

+2

감사합니다. (어쩌면 15 자까지받을 수 있습니다 ...) – Cynthia

+0

신시아는 당신을 업 (3) 할 수 없었습니다. 나는 그녀를 위해 이것을하고있다 =). –

2

목록이 변경되지 않고 FirstOrDefault에 의해 반환 된 개체가 여전히 포함됩니다.

이것은 모든 LINQ 연산자의 일반적인 규칙으로 원본 컬렉션을 수정하지 않습니다.

또한 thisEvent는 "복사"가 아닙니다 (Event가 클래스가 아닌 값 유형 (struct)가 아닌 경우). 이는 list에서 참조되는 동일한 객체에 대한 참조입니다.

+0

흠 ...하지만 동일한 객체에 대한 참조 인 경우 목록이 변경됩니다. 그렇지 않습니까? 적어도 그 객체의 관점에서 - 목록에 추가되거나 제거 된 요소가 아닌 요소. – Cynthia

+0

* list *는 변경되지 않습니다. FirstOrDefault()를 호출 한 후에도 같은 객체가 목록에 남아 있습니다. 그러나 네, 반환 된 참조를 통해 list * element *를 수정할 수 있습니다 (Event는 구조체가 아니라 클래스라고 가정 함). 이것은 .NET 참조의 특성으로 List 나 FirstOrDefault에 고유하지는 않습니다 : 마찬가지로'Event thatEvent = thisEvent;'라고 쓰면'thatEvent' 참조를 통해 객체에 대한 변경 사항도'thisEvent '참조. 하나의 객체, 다중 참조. – itowlson

+0

이 경우에는 거의 발생하지 않지만,이 질문을 완벽하게하기 위해 (http://stackoverflow.com/questions/4052204/how-to-define-ienumerable-behavior-by-contract)보십시오. FirstOrDefault()가 연결이 끊긴 것처럼 보이는 시나리오를 보여줍니다 (IEnumerable의 소스가 "수익률 반환"일 때 실제로 IEnumerable 항목이 다시 생성되었습니다). – AntonioR

0

Event이 참조 유형 인 경우 예 : thisEvent을 수정하면 목록의 요소가 수정됩니다.