如何仅向列表添加未处理过的ProductID求和项?(C#-ASP.NET)
问题分析与修复方案
嘿,我一眼就看出问题出在哪了——你用来判断「是否已处理过ProductID」的逻辑完全搞反了!
你现在用quantityArrayList.Contains(product)来检查,但quantityArrayList里存的是求和后的Quantity数值,不是ProductID本身啊!比如如果某个ProductID是3,而之前刚好有个求和结果也是3,代码就会错误跳过这个ProductID;要是ProductID的数值和所有求和结果都不一样,那重复出现的ProductID会被反复计算,导致列表里多出重复的求和值,这就是你看到后续结果异常的原因。
两步搞定问题
1. 单独维护已处理的ProductID集合
咱们需要一个专门的集合来记录已经处理过的ProductID,推荐用HashSet<int>(假设你的ProductID是int类型),它的Contains查询速度比列表快很多,适合做去重判断。
2. 修正循环判断逻辑
把原来判断求和列表的代码,改成判断这个新的ProductID集合。同时,我还帮你优化了查询效率——原代码每次循环都查一遍数据库,数据量大的时候会慢到离谱,咱们可以一次性把所有需要的结果从数据库里查出来。
修正后的代码
基础修复版(保留你原来的逻辑结构)
// 新增HashSet跟踪已处理的ProductID var processedProductIds = new HashSet<int>(); var quantityArrayList = new List<int>(); // 获取所有符合条件的ProductID(会有重复,后续去重) var dynamicReader = DBAccessor.InvoiceLines.Where(xx => xx.Quantity >= quantitySelected).Select(yy => yy.ProductID); foreach (var productId in dynamicReader) { if (!processedProductIds.Contains(productId)) { // 计算该ProductID的总Quantity var totalQty = DBAccessor.InvoiceLines.Where(gg => gg.ProductID == productId).Sum(g => g.Quantity); quantityArrayList.Add(totalQty); processedProductIds.Add(productId); // 标记为已处理,避免重复计算 } }
高效优化版(只查一次数据库,推荐用这个!)
直接让数据库帮我们完成分组求和,比在客户端循环高效太多:
// 一次查询搞定:筛选→分组→求和 var productTotals = DBAccessor.InvoiceLines .Where(line => line.Quantity >= quantitySelected) .GroupBy(line => line.ProductID) .Select(group => new { ProductID = group.Key, TotalQuantity = group.Sum(item => item.Quantity) }) .ToList(); // 提取求和结果到你的列表里 var quantityArrayList = productTotals.Select(result => result.TotalQuantity).ToList();
验证你的示例场景
当用户输入2时:
- 数据库先筛选出所有Quantity≥2的行,对应的ProductID是9、8、9...
- 按ProductID分组后,自动去重得到9和8,分别计算总Quantity为3和9
- 最终
quantityArrayList就是[3,9],完全符合你的预期,不会出现异常值
内容的提问来源于stack exchange,提问作者SeventhWarhawk
相关产品推荐
相关产品推荐

