2016-02-26 163 views
1

例如有兩個表具有相同的架構,但不同的內容:什麼是比較兩個表的最快方法?

表1

| field1 | field2  | field3  | 
---------------------------------------- 
| 1  | aaaaa  | 100   | 
| 2  | bbbbb  | 200   | 
| 3  | ccccc  | 300   | 
| 4  | ddddd  | 400   | 

表2

| field1 | field2  | field3  | 
---------------------------------------- 
| 2  | xxxxx  | 200   | 
| 3  | ccccc  | 999   | 
| 4  | ddddd  | 400   | 
| 5  | eeeee  | 500   | 

預期比較結果將是:

刪除了B:

| 1  | aaaaa  | 100   | 

不匹配:

Table1:| 2  | bbbbb  | 200   | 
Table2:| 2  | xxxxx  | 200   | 
Table1:| 3  | ccccc  | 300   | 
Table2:| 3  | ccccc  | 999   | 

B中

| 5  | eeeee  | 500   | 

新增使用C#,什麼是最快的方法比較兩張桌子?

當前我的實現是: 檢查table1中的每一行在table2中是否有完全匹配; 檢查table2中的每一行是否在table1中有完全匹配。

效率是n*n所以對於10萬行,需要20分鐘才能在服務器上運行。

非常感謝

+0

他們是'DataTables'嗎?如果是這樣的話,定義(主鍵)並進行比較。 –

回答

2

你可以嘗試這樣的事情,應該是相當快:

class objType 
{ 
    public int Field1 { get; set; } 
    public string Field2 { get; set; } 
    public int Field3 { get; set; } 

    public bool AreEqual(object other) 
    { 
     var otherType = other as objType; 
     if (otherType == null) 
      return false; 
     return Field1 == otherType.Field1 && Field2 == otherType.Field2 && Field3 == otherType.Field3; 
    } 
} 

var tableOne = new objType[] { 
    new objType { Field1 = 1, Field2 = "aaaa", Field3 = 100 }, 
    new objType { Field1 = 2, Field2 = "bbbb", Field3 = 200 }, 
    new objType { Field1 = 3, Field2 = "cccc", Field3 = 300 }, 
    new objType { Field1 = 4, Field2 = "dddd", Field3 = 400 } 
}; 

var tableTwo = new objType[] { 
    new objType { Field1 = 2, Field2 = "xxxx", Field3 = 200 }, 
    new objType { Field1 = 3, Field2 = "cccc", Field3 = 999 }, 
    new objType { Field1 = 4, Field2 = "dddd", Field3 = 400 }, 
    new objType { Field1 = 5, Field2 = "eeee", Field3 = 500 } 
}; 

var originalIds = tableOne.ToDictionary(o => o.Field1, o => o); 
var newIds = tableTwo.ToDictionary(o => o.Field1, o => o); 

var deleted = new List<objType>(); 
var modified = new List<objType>(); 

foreach (var row in tableOne) 
{ 
    if(!newIds.ContainsKey(row.Field1)) 
     deleted.Add(row); 
    else 
    { 
     var otherRow = newIds[row.Field1]; 
     if (!otherRow.AreEqual(row)) 
     { 
      modified.Add(row); 
      modified.Add(otherRow); 
     } 
    } 
} 

var added = tableTwo.Where(t => !originalIds.ContainsKey(t.Field1)).ToList(); 

可能是值得重寫Equals代替AreEqual(或使AreEqual類定義之外的helper方法)但這取決於你的項目是如何設置的。

+0

謝謝。它運作良好! – BayOtter

相關問題