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
相关产品推荐
相关产品推荐

