[英]What is the fastest way to compare two tables?
For example there are two tables with same schema, but different contents: 例如,有两个表具有相同的架构,但是内容不同:
Table1 表格1
| field1 | field2 | field3 |
----------------------------------------
| 1 | aaaaa | 100 |
| 2 | bbbbb | 200 |
| 3 | ccccc | 300 |
| 4 | ddddd | 400 |
Table2 表2
| field1 | field2 | field3 |
----------------------------------------
| 2 | xxxxx | 200 |
| 3 | ccccc | 999 |
| 4 | ddddd | 400 |
| 5 | eeeee | 500 |
The expected comparison result would be: 预期的比较结果将是:
Deleted in B: 在B中删除:
| 1 | aaaaa | 100 |
Mismatch: 不匹配:
Table1:| 2 | bbbbb | 200 |
Table2:| 2 | xxxxx | 200 |
Table1:| 3 | ccccc | 300 |
Table2:| 3 | ccccc | 999 |
Newly added in B 在B中新增
| 5 | eeeee | 500 |
Using C#, what is the fastest way to compare two tables? 使用C#,比较两个表的最快方法是什么?
Currently my implementation is: Check if each row in table1 has an exact match in table2; 当前我的实现是:检查table1中的每一行在table2中是否完全匹配; Check if each row in table2 has an exact match in table1. 检查表2中的每一行在表1中是否完全匹配。
The efficiency is n*n
so for 100k rows it takes 20 mins to run on a server. 效率为n*n
因此对于100k行,在服务器上运行需要20分钟。
Many thanks 非常感谢
You can try something like this, should be quite fast: 您可以尝试这样的操作,应该很快:
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();
Might be worth overriding Equals
instead of AreEqual
(or making AreEqual
a helper method outside the class definition), but that depends on how your project is setup. 可能值得重写Equals
而不是AreEqual
(或使AreEqual
成为类定义之外的帮助方法),但这取决于您的项目的设置方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.