购物车数据按编码与日期分组求和的实现方案咨询
不用LINQ实现购物车数据按编码+日期分组求和
嘿,我来帮你搞定这个问题!不用LINQ完全能实现,先解决你提到的无法访问CartProduct属性的核心难点,一步步来:
第一步:解决CartProduct属性访问问题
如果你的_products列表不是泛型的List<CartProduct>,而是List<object>或者非泛型集合,遍历的时候得先把元素转换成CartProduct类型,才能正常访问属性。这里用as转换加空检查,安全又稳妥:
foreach (var item in _products) { var cartProduct = item as CartProduct; if (cartProduct == null) continue; // 跳过非CartProduct的元素,避免报错 // 现在你就能正常访问cartProduct.Code、cartProduct.Date这些属性啦 }
第二步:用字典实现分组求和
核心思路是用字典存储每个(编码+日期)组合的求和结果:字典的键用来唯一标识一组(编码+日期),值就是该组的整数总和。
方法1:用Tuple作为分组键(简单快捷)
C#的Tuple已经帮我们重写了Equals和GetHashCode,可以直接当字典的键,不用额外写代码:
// 初始化字典,键是(编码, 日期)的组合,值是求和结果 var groupedSum = new Dictionary<Tuple<string, DateTime>, int>(); foreach (var item in _products) { var cartProduct = item as CartProduct; if (cartProduct == null) continue; // 注意:如果日期包含时间部分,建议用Date.Date只取日期部分,避免同一日期不同时间被分成两组 var groupKey = Tuple.Create(cartProduct.Code, cartProduct.Date.Date); if (groupedSum.ContainsKey(groupKey)) { // 已存在该分组,累加数值(这里假设要求和的是Quantity属性,你可以换成自己的字段) groupedSum[groupKey] += cartProduct.Quantity; } else { // 不存在该分组,初始化数值 groupedSum[groupKey] = cartProduct.Quantity; } } // 遍历查看结果 foreach (var entry in groupedSum) { Console.WriteLine($"编码: {entry.Key.Item1}, 日期: {entry.Key.Item2:yyyy-MM-dd}, 总和: {entry.Value}"); }
方法2:自定义分组键类(更清晰可控)
如果你觉得Tuple的Item1、Item2不够直观,可以自己写一个GroupKey类,重写Equals和GetHashCode来保证分组的正确性:
// 自定义分组键类 public class GroupKey { public string Code { get; set; } public DateTime Date { get; set; } // 重写Equals,判断两个GroupKey是否属于同一分组 public override bool Equals(object obj) { if (obj is GroupKey other) { // 比较编码和日期(同样只取日期部分,忽略时间) return Code == other.Code && Date.Date == other.Date.Date; } return false; } // 重写GetHashCode,确保同一分组的哈希值相同 public override int GetHashCode() { return HashCode.Combine(Code, Date.Date); } }
然后用这个类作为字典的键:
var groupedSum = new Dictionary<GroupKey, int>(); foreach (var item in _products) { var cartProduct = item as CartProduct; if (cartProduct == null) continue; var groupKey = new GroupKey { Code = cartProduct.Code, Date = cartProduct.Date.Date }; if (groupedSum.ContainsKey(groupKey)) { groupedSum[groupKey] += cartProduct.Quantity; } else { groupedSum[groupKey] = cartProduct.Quantity; } }
补充说明
- 如果你要求和的不是
Quantity,把代码里的cartProduct.Quantity换成你需要的整数属性就行。 - 如果你的
_products本来就是List<CartProduct>,那可以去掉as转换的步骤,直接遍历CartProduct类型的元素。
内容的提问来源于stack exchange,提问作者Rick Walker
相关产品推荐
相关产品推荐

