2010-03-12 61 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; 

我想知道的是:使用FirstOrDefault創建後thisEvent,是thisEvent仍然連接到清單?換句話說,當我更改這兩個屬性eventResolved和eventSequence時,實際上是改變了「list」還是thisEvent只是「list」中某個項目的完全斷開的副本?

回答

13

FirstOrDefault選擇一個集合中的一個項目,但不會「加密」或「克隆」它。即它是同一個實例。所以如果你修改一個屬性,你可以修改原始實例。

如果您想「對對象」進行「修改」,則必須以某種方式或其他方式對其進行復制。

+2

謝謝! (等等等等等於15個字符......) – Cynthia 2010-03-12 22:52:51

+0

辛西婭無法對你表示讚賞(3 rep)。我爲她做這個=)。 – 2010-03-12 22:54:22

2

列表未更改,並且仍包含FirstOrDefault返回的對象。

這是所有LINQ操作符的一般規則:它們從不修改源集合。

另請注意,此事件不是「複製」(除非事件是值類型(結構)而不是類) - 它是對列表中引用的同一對象的引用。

+0

嗯......但是如果它是對同一個對象的引用,那麼這個列表將會改變,不是嗎?至少,就該對象而言 - 不是從列表中添加或刪除某些元素。 – Cynthia 2010-03-12 22:57:17

+0

*列表*沒有改變。調用FirstOrDefault()後,相同的對象仍在列表中。但是,是的,它可以通過返回的引用來修改list * element *(同樣,假設Event是一個類而不是一個結構體)。這是.NET引用的一個特性,而不是列表或FirstOrDefault固有的東西:同樣,如果您編寫了'Event thatEvent = thisEvent;',那麼通過'thatEvent'引用對對象所做的更改也可以通過'thisEvent '參考。一個對象,多個引用。 – itowlson 2010-03-12 23:04:33

+0

在這種情況下很難發生,但爲了完整起見,請看這個問題(http://stackoverflow.com/questions/4052204/how-to-define-ienumerable-behavior-by-contract)。它顯示了FirstOrDefault()看起來像斷開連接(實際不是)的可能場景,實際上IEnumerable的源是「yield return」時IEnumerable項被重新創建)。 – AntonioR 2010-11-09 21:48:01

0

如果Event是引用類型,那麼是的,修改thisEvent將修改列表中的元素。