C# c比较2列表

C# c比较2列表,c#,C#,我有两个相同对象的列表。现在,第一个列表充满了数据库表中的数据。另一个列表是从服务器下载的数据 例如: public class HistoricData { public int Id{get;set;} public DateTime Date {get;set;} public string Name {get;set;} public float Impressions {get;set;} } 因此,在我的对象中,我有唯一的Id属性。现在我需要检查第二个列表中是否有不在第一个

我有两个相同对象的列表。现在,第一个列表充满了数据库表中的数据。另一个列表是从服务器下载的数据

例如:

public class HistoricData {
 public int Id{get;set;}
 public DateTime Date {get;set;}
 public string Name {get;set;}
 public float Impressions {get;set;}
}
因此,在我的对象中,我有唯一的Id属性。现在我需要检查第二个列表中是否有不在第一个列表中的对象。 我以为我可以在林克做到,但我有点被卡住了

var difference = from objHD in objHistoricData
                 join objHDN in objHistoricDataNew on objHD.Id equals objHDN.Id
                 select new {objHDNA = objHDN};
这总是返回0。

您需要重写Equals和GetHashcode,以便通过它们的值而不是它们的引用来比较您的类型。

您需要重写Equals和GetHashcode,以便通过它们的值而不是它们的引用来比较您的类型。

请尝试

var difference = list1.Except(list2);
但是我想。

试试看

var difference = list1.Except(list2);
但是我想

其中HistoricDataComparer是一个IEqualityComparer


其中HistoricDataComparer是IEqualityComparer

使用LINQ中的Except函数,并传递用于比较ID的IEqualityComparer

var difference = a.Except( b, new YouEqualitityComparer() )

使用LINQ中的Except函数,ans传递用于比较ID的IEqualityComparer

var difference = a.Except( b, new YouEqualitityComparer() )

我假设您希望选择objHistoricDataNew中与存储在objHistoricData中不同的所有项目

那么可能是这样的:

var difference = objhistoricDataNew.Where(objHDN => objHistoricData.Select(objHD => objHD.Id).IndexOf(objHDN.Id) == -1)

我假设您希望选择objHistoricDataNew中与存储在objHistoricData中不同的所有项目

那么可能是这样的:

var difference = objhistoricDataNew.Where(objHDN => objHistoricData.Select(objHD => objHD.Id).IndexOf(objHDN.Id) == -1)