如何将两个C# Agreements类型变量合并为一个实例?
合并两个Agreements实例的解决方案
你遇到的问题大概率是原代码未处理列表为null的情况,或是合并需求涉及去重但原代码未实现。以下是几种可行的解决方式:
1. 处理空列表的基础合并
如果只是单纯合并两个实例的列表,同时避免null引发的异常,可使用空合并运算符(??)确保列表不为空:
Agreements combinedSTDStatePlansAgreements = new Agreements { clientEnterpriseId = agreementsSTD.clientEnterpriseId, agreements = (agreementsSTD.agreements ?? new List<Agreement>()) .Concat(agreementsStatePlans.agreements ?? new List<Agreement>()) .ToList(), serviceAgreements = (agreementsSTD.serviceAgreements ?? new List<ServiceAgreement>()) .Concat(agreementsStatePlans.serviceAgreements ?? new List<ServiceAgreement>()) .ToList() };
这种方式会保留所有元素(包括重复项),同时避免因某个列表为null导致的空引用异常。
2. 合并并去重(基于唯一标识)
如果需要合并后去除重复的Agreement或ServiceAgreement对象,可自定义比较器结合Union方法实现:
首先定义比较器(假设对象有唯一标识属性Id):
// Agreement比较器 public class AgreementEqualityComparer : IEqualityComparer<Agreement> { public bool Equals(Agreement x, Agreement y) { return x?.Id == y?.Id; } public int GetHashCode(Agreement obj) { return obj?.Id.GetHashCode() ?? 0; } } // ServiceAgreement比较器 public class ServiceAgreementEqualityComparer : IEqualityComparer<ServiceAgreement> { public bool Equals(ServiceAgreement x, ServiceAgreement y) { return x?.Id == y?.Id; } public int GetHashCode(ServiceAgreement obj) { return obj?.Id.GetHashCode() ?? 0; } }
然后执行合并去重:
Agreements combinedSTDStatePlansAgreements = new Agreements { clientEnterpriseId = agreementsSTD.clientEnterpriseId, agreements = (agreementsSTD.agreements ?? new List<Agreement>()) .Union(agreementsStatePlans.agreements ?? new List<Agreement>(), new AgreementEqualityComparer()) .ToList(), serviceAgreements = (agreementsSTD.serviceAgreements ?? new List<ServiceAgreement>()) .Union(agreementsStatePlans.serviceAgreements ?? new List<ServiceAgreement>(), new ServiceAgreementEqualityComparer()) .ToList() };
3. 手动添加元素(更直观的方式)
如果觉得LINQ的写法不够直观,也可以手动初始化列表并添加元素:
Agreements combinedSTDStatePlansAgreements = new Agreements { clientEnterpriseId = agreementsSTD.clientEnterpriseId, agreements = new List<Agreement>(), serviceAgreements = new List<ServiceAgreement>() }; // 添加agreements列表元素 if (agreementsSTD.agreements != null) { combinedSTDStatePlansAgreements.agreements.AddRange(agreementsSTD.agreements); } if (agreementsStatePlans.agreements != null) { combinedSTDStatePlansAgreements.agreements.AddRange(agreementsStatePlans.agreements); } // 添加serviceAgreements列表元素 if (agreementsSTD.serviceAgreements != null) { combinedSTDStatePlansAgreements.serviceAgreements.AddRange(agreementsSTD.serviceAgreements); } if (agreementsStatePlans.serviceAgreements != null) { combinedSTDStatePlansAgreements.serviceAgreements.AddRange(agreementsStatePlans.serviceAgreements); }
原代码失效的常见原因
- 其中一个实例的
agreements或serviceAgreements为null,调用Concat时抛出空引用异常; - 需要去重但原代码未处理,导致合并结果包含重复对象,不符合预期。
内容的提问来源于stack exchange,提问作者Letoncse
相关产品推荐
相关产品推荐

