You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中foreach修改新集合时原集合值同步变更的原因及解决方法

问题原因

因为AgentModel是引用类型,你在代码中第一次把TousAgents的元素添加到AgentsContratEnCours时,并没有创建新的对象,只是把同一个对象的引用存到了第二个集合里。后续你修改AgentsContratEnCours里对象的TempsBase属性时,本质上修改的还是TousAgents里的原始对象,所以才会出现原始集合的值同步变化的情况。

你代码里的这行就是问题根源:

AgentsContratEnCours.Add(tsag);

这里你直接把TousAgents里的对象实例加进了新集合,两个集合共享同一个对象内存地址。

解决方法

方法1:修改现有逻辑,添加对象时做值拷贝

在添加元素到AgentsContratEnCours时,永远创建新的AgentModel实例,复制原对象的属性值,不要直接用原对象引用:

foreach (AgentModel tsag in TousAgents)
{
    var exist = AgentsContratEnCours.FirstOrDefault(p => p.Matricule == tsag.Matricule);
    if (exist == null)
    {
        // 新创建对象复制属性,不直接使用原对象
        AgentsContratEnCours.Add(new AgentModel 
        {
            Matricule = tsag.Matricule,
            TempsBase = tsag.TempsBase
        });
    }
    else
    {
        // 不需要删除再添加,直接修改已有对象属性即可
        exist.TempsBase += tsag.TempsBase;
    }
}

方法2:用LINQ的GroupBy直接生成聚合集合,代码更简洁高效

不需要手动写循环逻辑,直接分组聚合一步到位,从根源上避免修改原始集合:

AgentsContratEnCours = new ObservableCollection<AgentModel>(
    TousAgents
        .GroupBy(a => a.Matricule)
        .Select(g => new AgentModel 
        {
            Matricule = g.Key,
            TempsBase = g.Sum(a => a.TempsBase)
        })
);

内容的提问来源于stack exchange,提问作者GeffGeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:54:10