2
我試圖實現IEqualityComparer,因此我可以比較自定義對象的平等和差異。使用IEqualityComparer除了,Intersect
場景:我有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();
}
}
這就是所謂的「代碼」了。 現在看看你是否可以揭穿你自己的「選擇變得更快」的說法;) – 2014-10-16 13:41:04
哈哈,我很想揭穿或弄清楚,但是,我必須繼續前進,以保持這個關鍵項目的移動。速度提高會很好,但只是在節省7秒鐘來加載300萬條記錄。不過,我可能會在未來考慮這一點 – mrb398 2014-10-16 13:49:28