gpt4 book ai didi

c# - IEqualityComparer 使用 Except, Intersect

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:30 25 4
gpt4 key购买 nike

我正在尝试实现 IEqualityComparer,以便我可以比较自定义对象的相等性和差异性。

场景:我有 10 批在不同时间导入的记录集。我需要查看最近的记录集,并将其与之前的所有记录集进行比较,看看哪些记录以前出现过,哪些记录是第一次出现。

我的代码看起来很可靠,但我不明白为什么它不起作用。似乎所有的记录都被区分为以前存在的,没有任何记录是新的。

附带说明一下,如果我只选择一个 var,我的记录加载速度实际上要快一百万倍。有没有办法在 var 类型上设置 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();

这是我的类(class)和 IEqualityComparer



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

关于c# - IEqualityComparer 使用 Except, Intersect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26405787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com