【问题标题】:Compare two list of objects a in C# and retrieve another list with un match records比较 C# 中的两个对象列表 a 并检索具有不匹配记录的另一个列表
【发布时间】:2022-12-31 19:39:43
【问题描述】:

我有两个对象列表,我需要比较这两个列表并获得不匹配记录的结果。

var oldlist = new List<Employee>{
new Employee(){EmployeeID=123,Name="XXXX",Gender="Male",code="CSE"},
new Employee(){EmployeeID=231,Name="FFF",Gender="Male",code="EC"},
new Employee(){EmployeeID=431,Name="GGG",Gender="Female",code="IT"},
new Employee(){EmployeeID=543,Name="DDD",Gender="Female",code="IT"}
}
var newlist = new List<Employee>{
new Employee(){EmployeeID=123,Name="HHH",Gender="Male",code="IT"},
new Employee(){EmployeeID=231,Name="JJJ",Gender="FeMale",code="CSE"},
new Employee(){EmployeeID=431,Name="GGG",Gender="Female",code="IT"},
new Employee(){EmployeeID=543,Name="DDD",Gender="Female",code="IT"}
}

在上面的代码中,EmployeeId 将是相同的,但任何其他值都会发生变化,例如 对于 EmployeeId 123 和 231 其他值(姓名、性别、代码)可以更改我只需要从上面的示例结果中的新列表中获取更改的记录应该只给出 employeeId 123 和 231 的记录,因为其余记录未更改。

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用list1.except(list2) 找到两个列表之间的集合差异:-find-the-set-difference-between-two-lists-linq

     var result= oldlist.Except(newlist).ToList();
    

    编辑:

    您可以使用以下方法比较两个对象列表:

            List<Employee> list=new List<Employee>();
            foreach (var item in oldlist)
            {
                if(!newlist.Any(p=>p.EmployeeID==item.EmployeeID && p.Name == item.Name && p.Gender == item.Gender && p.code == item.code))
                   list.Add(item);
            }
    

    【讨论】:

    • 我试过这个它适用于 list<string> 不适用于对象
    • 您的代码示例是员工列表,而不是对象。
    • @Ramu 尝试使用我的代码
    • 这是完全错误的!上面链接中给出的示例适用于字符串或其他值类型。它不能用于引用类型。您需要一个实现 IComparer<Employee> 的类的实例来确定是否有两个引用类型的实例包含不同的数据。见learn.microsoft.com/en-us/dotnet/api/…
    • @Ramu 我编辑了答案
    【解决方案2】:

    @HosseinSabziani 的回答也是正确的

    或者,您可以使用 System.Linq.Enumerable 扩展来执行此操作,

    像这样

    员工类

       class Employee: IEqualityComparer<Employee>
       {
            public int EmployeeID { get; set; }
            public string Name { get; set; }
            public string Gender { get; set; }
            public string code { get; set; }
            public bool Equals(Employee x, Employee y)
            {
                return x.EmployeeID == y.EmployeeID;
            }
        
            public int GetHashCode(Employee obj)
            {
                return obj.EmployeeID.GetHashCode();
            }
       }
    
    var unmatched = oldlist
    .Where(old => !newlist.Any(newitem => new Employee().Equals(old, newitem)))
    .ToList();
    
    // or
    
    var unmatched = oldlist
    .Where(old => !newlist.Any(newitem => newitem.EmployeeID == old.EmployeeID))
    .ToList();
    
    

    还有 JoinWhere 扩展名

    var unmatched = (from old in oldlist
           join newitem in newlist on 
           old.EmployeeID equals 
           newitem.EmployeeID into joined from j in joined.DefaultIfEmpty()
           here j == null
           select old).ToList();
    
    

    完整源代码

    // Online C# Editor for free
    // Write, Edit and Run your C# code using C# Online Compiler
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class HelloWorld
    {
        class Employee: IEqualityComparer<Employee>
       {
            public int EmployeeID { get; set; }
            public string Name { get; set; }
            public string Gender { get; set; }
            public string code { get; set; }
            public bool Equals(Employee x, Employee y)
            {
                return x.EmployeeID == y.EmployeeID;
            }
        
            public int GetHashCode(Employee obj)
            {
                return obj.EmployeeID.GetHashCode();
            }
       }
    
        public static void Main(string[] args)
        {
            var oldlist = new List<Employee>{
               new Employee(){EmployeeID=123,Name="XXXX",Gender="Male",code="CSE"},
               new Employee(){EmployeeID=231,Name="FFF",Gender="Male",code="EC"},
               new Employee(){EmployeeID=431,Name="GGG",Gender="Female",code="IT"},
               new Employee(){EmployeeID=543,Name="DDD",Gender="Female",code="IT"}
           };
           
           var newlist = new List<Employee>{
              new Employee(){EmployeeID=123,Name="HHH",Gender="Male",code="IT"},
              new Employee(){EmployeeID=231,Name="JJJ",Gender="FeMale",code="CSE"},
              new Employee(){EmployeeID=431,Name="GGG",Gender="Female",code="IT"},
              new Employee(){EmployeeID=543,Name="DDD",Gender="Female",code="IT"}
           };
           
           var unmatched = oldlist.Where(old => !newlist.Any(newitem => new Employee().Equals(old, newitem))).ToList();
           
           Console.WriteLine ("Len: " + unmatched.Count);
        }
    }
    

    【讨论】:

    • 这是完全错误的!上面链接中给出的示例适用于字符串或其他值类型。它不能用于引用类型。您需要一个实现 IComparer<Employee> 的类的实例来确定是否有两个引用类型的实例包含不同的数据。见learn.microsoft.com/en-us/dotnet/api/…
    • @Steve OP 问题是Compare two list of objects a in C# and retrieve another list with un match records 是否要实现接口取决于他,我只是展示一个简单的演示
    • @Steve 但是,让我修复
    • 您是否阅读了 OP 期望的输出?他们对不匹配元素的定义是任何具有相同 id 但具有不同属性的元素。结果应该是第一个和第二个对象。因为对象的属性发生了变化,而 id 是相同的。
    • @史蒂夫完成了!谢谢你的建议
    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多