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
相关产品推荐
相关产品推荐

