首页 > 解决方案 > 如何找到 2 个列表模型之间的差异

问题描述

面临比较 2 个模型列表的问题。

public class Relations
    {
        [key]
        public int Id { get; set; }
        public int CounterpartyId { get; set; }
        public int CounterpartyTypeId { get; set; }
        public int DebTypeId { get; set; }
    }

我有方法从前端获取此模型的列表并从数据库中获取列表。当来自前端的模型没有 id 时,我没有将 id 添加到这个模型中。例如:

            var models = new List<Relations>()
            {
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 1,
                    DebTypeId = 1
                },
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 2,
                    DebTypeId = 1001
                }
            };

            var entity = new List<Relations>()
            {
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 1,
                    DebTypeId = 1
                },
                
            };

如何比较这两个模型列表???我需要插入模型(CounterpartyId = 1,CounterpartyTypeId = 2,DebTypeId = 1001)

为了避免数据库中的重复,我尝试

IEnumerable<Relations> toInsert = models.Except<Relations>(entity);

并尝试

var test=(from m in models select m).Except(entity).ToList();

但它们是相同的,无法找到不在数据库中的数据

标签: c#listlinq

解决方案


正如彼得史密斯在评论部分建议的那样,您可以创建您的Comparer

sealed class MyComparer : IEqualityComparer<Relations>
{
    public bool Equals(Relations x, Relations y)
    {
        if (x == null)
            return y == null;
        else if (y == null)
            return false;
        else
            return x.CounterpartyId == y.CounterpartyId  && x.CounterpartyTypeId == y.CounterpartyTypeId && x.DebTypeId == y.DebTypeId ;
    }

    public int GetHashCode(Relations obj)
    {
        return obj.Id.GetHashCode();
    }
}

Except()并按如下方式使用重载:

IEnumerable<Relations> toInsert = models.Except<Relations>(entity, new MyComparer());

推荐阅读