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

C#遍历两个按日期分组的对象列表合并存入ObservableCollection问询

实现方案

你可以通过LINQ关联两个按日期分组的集合,按Date归集后匹配同交易号的记录,最终填充到ObservableCollection<Transaction>中,实现代码如下:

首先先将q4转为内存列表,避免IQueryable多次触发数据库查询:

var q4List = q4.ToList();
Transactions = new ObservableCollection<Transaction>();

之后遍历所有日期并关联匹配记录:

// 取两个集合所有日期的并集,避免遗漏任意一方存在的日期
var allDates = q.Select(x => x.Date).Union(q4List.Select(x => x.Date)).Distinct();

foreach (var currentDate in allDates)
{
    // 分别取出两个集合中当前日期的详情列表,不存在则返回空集合
    var qDetails = q.FirstOrDefault(g => g.Date == currentDate)?.Details ?? new();
    var q4Details = q4List.FirstOrDefault(g => g.Date == currentDate)?.Details ?? new();

    // 按Trans交易号关联同日期下的两条记录,此处为左关联,保留q中所有记录,无匹配的q4信息会留空
    var matchedItems = from qItem in qDetails
                       join q4Item in q4Details
                       on qItem.Trans equals q4Item.Trans into tempJoin
                       from q4Matched in tempJoin.DefaultIfEmpty()
                       select new { qItem, q4Matched };

    // 批量添加到ObservableCollection
    foreach (var item in matchedItems)
    {
        Transactions.Add(new Transaction
        {
            Details = $"Date: {currentDate:yyyy-MM-dd}",
            TransDet = item.q4Matched != null 
                ? $"Time: {item.q4Matched.Time} | Reference: {item.q4Matched.Ref} | Location: {item.q4Matched.Location} | Discount: {item.q4Matched.Discount} | Total: {item.q4Matched.Totals}"
                : "无对应附加交易信息",
            ItemDet = item.qItem.Name,
            Price = item.qItem.Price,
            Trans = item.qItem.Trans,
            Isvisible = false
        });
    }
}

注意事项

  • 如果需要保留q4中存在但q中不存在的交易记录,可以调整关联逻辑为全外连接即可
  • 若Date是带时分秒的DateTime类型,注意统一日期精度(比如仅取年月日部分),避免因时间精度问题导致关联失败
  • 若同日期下存在一个Trans对应多条记录的情况,代码会自动生成多条合并后的记录,符合业务需求即可直接使用

内容的提问来源于stack exchange,提问作者Stalo Hadjitofi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:06:02