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