添加元素的For循环未执行完整次数问题排查
问题分析与修复方案
嘿,我一眼就瞅出你添加循环里的问题了!核心原因是你的循环终止条件依赖了动态变化的DelegatesList.Count,导致循环提前结束了。
拿你测试的场景来说:newQuantity=8,初始DelegatesList.Count=1,一开始newQuantity - lineItem.DelegatesList.Count等于7,循环条件是z <=7。但每次执行Add操作后,集合长度会加1,这个差值就会不断缩小:
- z=0:添加后Count=2,差值变为6 → 满足
z<=6 - z=1:添加后Count=3,差值变为5 → 满足
z<=5 - z=2:添加后Count=4,差值变为4 → 满足
z<=4 - z=3:添加后Count=5,差值变为3 → 此时z=3满足
z<=3,继续添加 - z=4:此时差值是
8-5=3,4<=3不成立,循环直接停止
所以总共只执行了4次添加操作,集合长度从1变成5,和你遇到的情况完全吻合。
修复方法
解决思路很简单:先把需要添加的元素总数计算好,存成一个固定变量,不让循环条件依赖动态变化的集合长度。
修正后的代码片段如下:
if (lineItem.DelegatesList.Count < newQuantity) { // 先算出需要添加的总数,用固定变量存储,避免动态变化影响循环 int itemsToAdd = newQuantity - lineItem.DelegatesList.Count; for (int z = 0; z < itemsToAdd; z++) { lineItem.DelegatesList.Add(new OrderDelegate()); } }
额外小优化
另外,你移除元素的循环也可以简化一下,不用遍历筛选再删除,直接用RemoveAll更简洁高效,还能避免遍历集合时修改集合的潜在风险:
// 替换原来的foreach移除逻辑 lineItem.DelegatesList.RemoveAll(f => f.OrderLineId == orderLineId);
内容的提问来源于stack exchange,提问作者Paul Almond
相关产品推荐
相关产品推荐

