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

如何将两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:01