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

购物车数据按编码与日期分组求和的实现方案咨询

不用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:19:21