Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 无法修改IEnumerable中对象的属性<;T>;_.net_C# 4.0 - Fatal编程技术网

.net 无法修改IEnumerable中对象的属性<;T>;

.net 无法修改IEnumerable中对象的属性<;T>;,.net,c#-4.0,.net,C# 4.0,我在更改IEnumerable集合中对象的属性时遇到问题。我将集合传递给另一个方法,以删除集合中实体之间的重复信息。这在方法中起作用,但一旦方法执行完毕并返回给调用方,更改就会丢失。但是,如果我将IEnumerable转换为列表,它将按预期工作。我唯一的猜测是,当我调用ToList时,它变成了一个具体的类型,允许它工作,但这不应该是一个限制,对吗 此外,如果不是在延迟执行的上下文中,这也毫无价值。 这最终不是真的,编译器正在重写RetrieveTrackingFilters方法以利用延迟执行 这

我在更改IEnumerable集合中对象的属性时遇到问题。我将集合传递给另一个方法,以删除集合中实体之间的重复信息。这在方法中起作用,但一旦方法执行完毕并返回给调用方,更改就会丢失。但是,如果我将IEnumerable转换为列表,它将按预期工作。我唯一的猜测是,当我调用ToList时,它变成了一个具体的类型,允许它工作,但这不应该是一个限制,对吗

此外,如果不是在延迟执行的上下文中,这也毫无价值。 这最终不是真的,编译器正在重写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);
        }    
    }

    ...
}
public IEnumerable RetrieveTrackingFilters(字符串编号)
{
var trackingFilters=new EntityCollection(new TrackingOverviewFilterEntityFactory());
var filter=newrelationpredictebucket();
filter.Relations.Add(TrackingOverviewFilterEntity.Relations.TrackingOverviewEntity使用TrackingOverviewID);
filter.PredicateExpression.Add(TrackingOverviewFields.ProNumber==ProNumber);
DataAccessAdapterFactory.Instance().FetchEntityCollection(trackingFilters,filter);
return BuildTrackingFilterColl(trackingFilters);//只需更新一个DTO对象并填充它
}
公共跟踪摘要ViewModel RetrieveTrackingSummary(字符串proNumber)
{
...
var trackingFilters=this.\u TrackingOverviewDataController.RetrieveTrackingFilters(proNumber.ToList();//有效
//var trackingFilters=this.\u TrackingOverviewDataController.RetrieveTrackingFilters(proNumber);//不工作
RemovedUpplicateFilterData(trackingFilters);//如果不执行ToList(),则此方法调用中发生的更改不会持久
...
}
私有静态无效已移除UpplicateFilterData(IEnumerable筛选器)
{
var valuePairs=新字典();
foreach(过滤器中的var过滤器)
{
if(valuePairs.ContainsKey(“comments”)&&valuePairs[“comments”].Contains(filter.comments))
{
filter.Comments=string.Empty;
}
如果(!string.IsNullOrWhiteSpace(filter.Comments))
{
如果(!valuePairs.ContainsKey(“注释”))
{
添加(“注释”,新列表());
}
valuePairs[“comments”].Add(filter.comments);
}    
}
...
}

如果您的
RetrieveTrackingFilters(proNumber)
返回一个
IQueryable
,那么这将导致每次枚举它时都创建新对象:一旦在
RemovedUpplicateFilterData
内(那里的更改将丢失)当您稍后在
RetrieveTrackingSummary
中使用它时(此时将提供一个新的、未触及的副本)


尝试将
.ToList()
更改为
.AsEnumerable()
。它应该仍能正常工作

“我的代码粘贴”中的第一个方法是RetrieveTrackingFilters,它返回IEnumerable。@joshlrogers,IQueryable实现IEnumerable,因此IQueryable可以“隐藏”在IEnumerable中。@joshlrogers,检查debuggerOk中的运行时类型,返回的类型是:System.Linq.Enumerable.Where SelectEnumerableInterator,这意味着编译器正在重写我的第一个方法以实际执行延迟执行。所以我必须执行ToList()来执行查询。谢谢你给我指引了正确的方向。我会将您的回答标记为答案。
。ToList()
不是对列表的转换,它是一个扩展方法,使用IEnumerable中的值创建一个新列表。结果不是将旧结构转换为列表,而是使用与旧结构相同的元素的新结构。@albin sunnanbo,对不起,你是对的,我使用了错误的措辞。我知道,你的类型真的是结构吗?