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);
}
}
...
}
`.ToList()`是不是一個澆鑄到一個列表,它是一個創建與從IEnumerable的值的新的列表的擴展方法。結果並不是陳舊的結構,而是與舊的結構相同的新結構。 – 2010-11-30 15:37:41
@albin sunnanbo,對不起,你說的沒錯,我用錯了。我其實知道這一點。 – joshlrogers 2010-11-30 15:39:45