【问题标题】:IEqualityComparer to use Except, IntersectIEqualityComparer 使用除、相交
【发布时间】:2014-12-11 21:38:42
【问题描述】:

我正在尝试实现 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();

这是我的课程和 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();
        }
    }

【问题讨论】:

    标签: c# intersect except iequalitycomparer


    【解决方案1】:

    好的,我发现问题不在于代码,而在于我的逻辑。

    在选择以前的记录时,我并没有排除当前的记录集。因此,在比较时,所有记录都被认为是旧的,因为所有记录都存在于历史记录中,包括我试图检查的记录。

    基本上只需要更新到这一行

    where i.CustomerId == customerId && i.ImportId != importId
    

    【讨论】:

    • 这也叫“代码”。现在看看你是否可以揭穿你自己的“选择 var 更快”的说法;)
    • 哈哈,我很想揭穿或弄清楚,但可惜我现在必须继续推进以保持这个关键项目的进展。速度提高会很好,但只是在谈论节省 7 秒来加载 300 万条记录。不过,我可能会在未来研究这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多