2010-11-30 37 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()。它应该仍然是一样的。

相关问题