2014-10-16 2 views
2

Я пытаюсь реализовать IEqualityComparer, поэтому я могу сравнить пользовательские объекты для равенства и различий.IEqualityComparer для использования Кроме того, Intersect

Сценарий: У меня есть 10 партий записей, которые были импортированы в разное время. Мне нужно посмотреть на самый последний набор записей и сравнить его со всеми предыдущими наборами записей и посмотреть, какие записи появились раньше, и какие записи появились в первый раз.

Мой код выглядит солидно, и я не могу понять, почему это не работает. Кажется, что все записи различаются как присутствующие ранее, и никакие записи никогда не бывают новыми.

На боковой ноте моя загрузка записи буквально в миллион раз быстрее, если я просто выбираю в var. Есть ли способ настроить IEqualityComparer на тип var? Или это зависит от конкретного типа объекта?

Это код вытягивать записи:




    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(); 
     } 
    } 

ответ

1

Хорошо, я понял, что проблема не с кодом, это было с моей логикой ,

При выборе предыдущих записей я не был исключен из текущего набора записей. Поэтому при сравнении все записи считались старыми, потому что все записи были представлены в исторических записях, включая записи, которые я пытался проверить.

в основном просто нужно обновить до этой линии

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

Это называется «код» тоже. Теперь, чтобы узнать, можете ли вы развенчать свой собственный «выбор в var быстрее»:) –

+0

Ха-ха, я бы хотел развенчать или понять это, но, увы, мне нужно продолжать продвигаться вперед, чтобы сохранить этот критический ход проекта , Увеличение скорости было бы неплохо, но речь шла только о том, чтобы сэкономить 7 секунд, чтобы загрузить 3 миллиона записей. Вероятно, я посмотрю на это в будущем, хотя – mrb398

Смежные вопросы