C# 要使用的IEqualityComparer除外,相交
我正在尝试实现IEqualityComparer,以便比较自定义对象的相等性和差异性 场景:我有10批在不同时间导入的记录集。我需要查看最新的记录集,并将其与以前的所有记录集进行比较,看看哪些记录以前出现过,哪些记录是第一次出现的 我的代码看起来很可靠,我不明白为什么这不起作用。似乎所有的记录都被区分为以前的记录,并且没有任何记录是新的 另一方面,如果我只选择一个变量,我的记录加载速度实际上要快一百万倍。有没有办法在一个变量类型上设置IEqualityComparer?还是取决于特定的对象类型 这是提取记录的代码:C# 要使用的IEqualityComparer除外,相交,c#,intersect,except,iequalitycomparer,C#,Intersect,Except,Iequalitycomparer,我正在尝试实现IEqualityComparer,以便比较自定义对象的相等性和差异性 场景:我有10批在不同时间导入的记录集。我需要查看最新的记录集,并将其与以前的所有记录集进行比较,看看哪些记录以前出现过,哪些记录是第一次出现的 我的代码看起来很可靠,我不明白为什么这不起作用。似乎所有的记录都被区分为以前的记录,并且没有任何记录是新的 另一方面,如果我只选择一个变量,我的记录加载速度实际上要快一百万倍。有没有办法在一个变量类型上设置IEqualityComparer?还是取决于特定的对象类型
List currentRecords = (from importRecord in db.ImportRecords
join i in db.Imports on importRecord.ImportId equals i.ImportId
where i.ImportId == importId
select new RecordLite
{
RecordId = importRecord.RecordId,
IdCode = importRecord.IdCode,
IdText1 = importRecord.IdText1,
IdText2 = importRecord.IdText2,
UniqueId = importRecord.UniqueId,
}).ToList();
List historicalRecords = (from importRecord in db.ImportRecords
join i in db.Imports on importRecord.ImportId equals i.ImportId
where i.CustomerId == customerId
select new RecordLite
{
RecordId = importRecord.RecordId,
IdCode = importRecord.IdCode,
IdText1 = importRecord.IdText1,
IdText2 = importRecord.IdText2,
UniqueId = importRecord.UniqueId,
}).ToList();
List newRecords = currentRecords.Except(historicalRecords, new RecordLiteComparer()).ToList();
List oldRecords = currentRecords.Intersect(historicalRecords, new RecordLiteComparer()).ToList();
这是我的班级和我的资格比较
public class RecordLite
{
public int RecordId { get; set; }
public string IdCode { get; set; }
public string IdText1 { get; set; }
public string IdText2 { get; set; }
public string UniqueId { get; set; }
}
public class RecordLiteComparer : IEqualityComparer
{
public bool Equals(RecordLite x, RecordLite y)
{
if (object.ReferenceEquals(x, y))
return true;
if (x == null || y == null)
return false;
return x.IdCode.Equals(y.IdCode, StringComparison.CurrentCultureIgnoreCase);
}
public int GetHashCode(RecordLite obj)
{
return new { obj.IdCode }.GetHashCode();
}
}
好吧,我发现问题不在于代码,而在于我的逻辑 选择以前的记录时,我没有排除当前记录集。所以当比较时,所有的记录都被认为是旧的,因为所有的记录都存在于历史记录中,包括我试图对照的记录 基本上只需要更新到这一行
where i.CustomerId == customerId && i.ImportId != importId
这也叫做“代码”。现在,看看您是否可以揭穿自己的“选择var更快”语句;)哈哈,我很想揭穿或弄明白,但唉,我现在必须继续推进,以保持这一关键项目的进展。速度的提高会很好,但我们只是说节省7秒来加载300万条记录。不过,我将来可能会研究这个问题