2014-10-16 62 views
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(); 
     } 
    } 

回答

1

好吧,我想通了,這個問題是不是代碼,這是我的邏輯。

選擇以前的記錄時,我並不排除當前的記錄集。所以在比較時,所有記錄都被認爲是舊的,因爲所有記錄都出現在歷史記錄中,包括我試圖檢查的記錄。

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

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

這就是所謂的「代碼」了。 現在看看你是否可以揭穿你自己的「選擇變得更快」的說法;) – 2014-10-16 13:41:04

+0

哈哈,我很想揭穿或弄清楚,但是,我必須繼續前進,以保持這個關鍵項目的移動。速度提高會很好,但只是在節省7秒鐘來加載300萬條記錄。不過,我可能會在未來考慮這一點 – mrb398 2014-10-16 13:49:28