Я пытаюсь реализовать 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();
}
}
Это называется «код» тоже. Теперь, чтобы узнать, можете ли вы развенчать свой собственный «выбор в var быстрее»:) –
Ха-ха, я бы хотел развенчать или понять это, но, увы, мне нужно продолжать продвигаться вперед, чтобы сохранить этот критический ход проекта , Увеличение скорости было бы неплохо, но речь шла только о том, чтобы сэкономить 7 секунд, чтобы загрузить 3 миллиона записей. Вероятно, я посмотрю на это в будущем, хотя – mrb398