2010-11-30 44 views
2

我有修改對象的屬性IEnumerable集合中的問題修改對象的屬性。我將集合傳遞給另一個方法,以刪除集合中實體的重複信息。這在該方法內工作,但一旦該方法完成執行並返回給調用者,更改將丟失。但是,如果我將IEnumerable轉換爲列表,它按預期工作。我唯一的猜測是,因爲當我打電話給ToList它變成了一個具體類型,並允許它工作,但這不應該是一個限制,對吧?未能在一個IEnumerable <T>

而且它是沒有價值,這是不是在延遲執行的情況下。 這最終沒有被真正的編譯器重寫RetrieveTrackingFilters方法採取延遲執行

的優勢,這是下調代碼:

public IEnumerable<TrackingFilter> RetrieveTrackingFilters(string proNumber) 
{ 
    var trackingFilters = new EntityCollection<TrackingOverviewFilterEntity>(new TrackingOverviewFilterEntityFactory()); 

    var filter = new RelationPredicateBucket(); 
    filter.Relations.Add(TrackingOverviewFilterEntity.Relations.TrackingOverviewEntityUsingTrackingOverviewId); 
    filter.PredicateExpression.Add(TrackingOverviewFields.ProNumber == proNumber); 

    DataAccessAdapterFactory.Instance().FetchEntityCollection(trackingFilters, filter); 

    return BuildTrackingFilterColl(trackingFilters); //Just news up a DTO object and populates it 
} 

public TrackingSummaryViewModel RetrieveTrackingSummary(string proNumber) 
{ 
    ... 
    var trackingFilters = this._TrackingOverviewDataController.RetrieveTrackingFilters(proNumber).ToList(); //Works 
    //var trackingFilters = this._TrackingOverviewDataController.RetrieveTrackingFilters(proNumber); //Doesn't work 

    RemoveDuplicateFilterData(trackingFilters); //If I don't do a ToList() then the changes that occur in this method call do not persist 
    ... 
} 

private static void RemoveDuplicateFilterData(IEnumerable<TrackingFilter> filters) 
{ 
    var valuePairs = new Dictionary<string, IList<object>>(); 

    foreach (var filter in filters) 
    { 
     if (valuePairs.ContainsKey("comments") && valuePairs["comments"].Contains(filter.Comments)) 
     { 
      filter.Comments = string.Empty; 
     } 
     else if (!string.IsNullOrWhiteSpace(filter.Comments)) 
     { 
      if (!valuePairs.ContainsKey("comments")) 
      { 
       valuePairs.Add("comments", new List<object>()); 
      } 

      valuePairs["comments"].Add(filter.Comments); 
     }  
    } 

    ... 
} 
+2

`.ToList()`是不是一個澆鑄到一個列表,它是一個創建與從IEnumerable的值的新的列表的擴展方法。結果並不是陳舊的結構,而是與舊的結構相同的新結構。 – 2010-11-30 15:37:41

+0

@albin sunnanbo,對不起,你說的沒錯,我用錯了。我其實知道這一點。 – joshlrogers 2010-11-30 15:39:45

回答

3

如果您RetrieveTrackingFilters(proNumber)返回IQueryable,那麼這會造成新的對象每次可以枚舉它時創建的:一旦內RemoveDuplicateFilterData(相應的修改將被丟失),一旦當你在RetrieveTrackingSummary用它做什麼後(此時將提供一個新的,不變的複印件)。

嘗試改變.ToList().AsEnumerable()。它應該仍然是一樣的。

相關問題