比较两个相同类型的对象列表

时间:2015-03-05 23:53:20

标签: c#

这是自定义对象的定义方式:

public class AccountDomain
{
    public string MAILDOMAIN { get; set; }
    public string ORG_NAME { get; set; }
}

这就是我填充对象列表的方式:

    List<AccountDomain> mainDBAccountDomain = mainDB.GetAllAccountsAndDomains();
    List<AccountDomain> manageEngineAccountDomain = ManageEngine.GetAllAccountsAndDomains();

此代码工作正常 - 如果我查看本地窗口,我可以在mainDBAccountDomain和manageEngineAccountDomain中看到对象列表。

我正在努力争取下一位,理想情况下,我想要一个类型为AccountDomain的新列表,其中包含mainDBAccountDomain中的所有条目以及 ManageEngineAccountDomain

任何帮助都非常感激,即使它只是指向正确的方向!

1 个答案:

答案 0 :(得分:1)

  

我想要一个类型为AccountDomain的新列表,其中包含mainDBAccountDomain中的所有条目以及 ManageEngineAccountDomain

linq对象非常简单,它正是Enumerable.Except函数的作用:

var result = mainDBAccountDomain.Except(manageEngineAccountDomain).ToList();

如果您需要与引用相等的内容不同,可以将比较器传递给Except函数,或者您可以在Equals中实现GetHashCodeAccountDomain(并可选择实现) IEquatable<AccountDomain>除了这些之外)。

如果您需要有关比较器的更多详细信息,请参阅this explanation

以下是一个例子:

public class AccountDomainEqualityComparer : IEqualityComparer<AccountDomain>
{
    public static readonly AccountDomainEqualityComparer Instance
        = new AccountDomainEqualityComparer();

    private AccountDomainEqualityComparer()
    {
    }

    public bool Equals(AccountDomain x, AccountDomain y)
    {
        if (ReferenceEquals(x, y))
            return true;

        if (x == null || y == null)
            return false;

        return x.MAILDOMAIN == y.MAILDOMAIN
            && x.ORG_NAME == y.ORG_NAME;
    }

    public int GetHashCode(AccountDomain obj)
    {
        if (obj == null)
            return 0;

        return (obj.MAILDOMAIN ?? string.Empty).GetHashCode()
            ^ (397 * (obj.ORG_NAME ?? string.Empty).GetHashCode());
    }
}

然后,你就这样使用它:

var result = mainDBAccountDomain.Except(manageEngineAccountDomain, 
                                        AccountDomainEqualityComparer.Instance)
                                .ToList();