如何通过ClientId将两个列表合并到ReferralModel中?
高效关联ReferralModel与ReferralForm列表
模型定义
public class ReferralModel { public string? ClientName { get; set; } public Guid? ClientId { get; set; } public string? ClientNumber { get; set; } public string? ClientDOB { get; set; } public string? DateSubmitted { get; set; } = default; public DateTime? ModifiedDateSubmitted { get; set; } public string? ReportStatus { get; set; } public string? ReferralNotes { get; set; } public ReferralForm? referralForm { get; set; } } public class ReferralForm { public Guid FileId { get; set; } public Guid ClientId { get; set; } public string? Name { get; set; } public string? FileName { get; set; } public string? ContentType { get; set; } public string? FileExtension { get; set; } public byte[]? FileContent { get; set; } public DateTime CreatedDate { get; set; } }
问题场景
现有两个列表:
var referrals = new List<ReferralModel>(); var referralForms = new List<ReferralForm>();
需要将referralForms中与ReferralModel拥有相同ClientId的项,关联到对应ReferralModel的referralForm属性。由于数据量可达数千条,普通嵌套遍历性能不足,需实现高效的即时映射方案。
解决方案
利用字典的O(1)查找特性,先将referralForms构建为以ClientId为键的查找表,再遍历referrals完成匹配,整体时间复杂度为O(n+m)(n、m分别为两个列表的长度),性能远超嵌套遍历。
代码实现
// 构建ClientId到ReferralForm的映射字典,处理多Form对应同一ClientId的情况(此处取第一个,可按需调整) var formLookup = referralForms .GroupBy(form => form.ClientId) .ToDictionary(group => group.Key, group => group.First()); // 遍历referrals,通过字典快速匹配关联 foreach (var referral in referrals) { if (referral.ClientId.HasValue && formLookup.TryGetValue(referral.ClientId.Value, out var matchedForm)) { referral.referralForm = matchedForm; } }
补充说明
- 若同一
ClientId对应多个ReferralForm,可根据业务需求修改匹配逻辑,比如取最新创建的表单:.ToDictionary(group => group.Key, group => group.OrderByDescending(f => f.CreatedDate).First()); - 该方案在数千条数据的场景下几乎可以即时完成映射,完全满足性能要求。
内容的提问来源于stack exchange,提问作者CodeMan03
相关产品推荐
相关产品推荐

