将文件与没有主键的db表进行比较

时间:2015-09-29 16:55:53

标签: c# .net datatable

我有平面文件...有管道分隔值... 此外,我们还为每个文件都有相应的表格。

表/文件没有任何唯一/主要列。

为了比较数据,我们将文件转换为数据表(c#,。net)

在DB_Datatable中占第一行......  将它与file_DataTable

中的每一行进行比较

如果我们在file_dataTable中找不到匹配...我们会考虑不同。

在这种情况下,如果两个表都匹配...并且每个表有10个记录......那么就会有100行比较。

此逻辑有效,但对于文件> 20K,这需要很长时间。

有人可以建议我采用更好的方法吗?

注意:我们可以为每一行创建一个哈希值(使用每行的内容)......并根据它进行排序吗?

1 个答案:

答案 0 :(得分:0)

使用DataRowComparer<TRow>Dictionary进行此操作。

示例用法(不比较两个数据表,但是,这应该可以帮助您开始):

var dt = new DataTable();
dt.Columns.Add("Foo", typeof(string));
dt.Columns.Add("Bar", typeof(int));
dt.Rows.Add("Test", 1);
dt.Rows.Add("Test", 2);
dt.Rows.Add("Testing",1);
dt.Rows.Add("Testing",1);
var dictionary = new Dictionary<DataRow, int>(DataRowComparer<DataRow>.Default);
foreach(var row in dt.AsEnumerable())
{
    if (!dictionary.ContainsKey(row)) dictionary[row] = 1;
    else dictionary[row]++;
}

输出与预期一致:它显示3个项目,第三个项目(“测试”,1)的值为2。

或者,您可以使用具有相同自定义比较器的HashSet。查找应至少为O(1)而不是O(n)

无论哪种方式,复杂性应从O(n1 * n2)减少到O(n)

var dt = new DataTable();
dt.Columns.Add("Foo", typeof(string));
dt.Columns.Add("Bar", typeof(int));
dt.Rows.Add("Test", 1);
dt.Rows.Add("Test", 2);
dt.Rows.Add("Testing",1);
dt.Rows.Add("Testing",1);
var hash = new HashSet<DataRow>(DataRowComparer<DataRow>.Default);
foreach(var row in dt.AsEnumerable())
{
    if (hash.Contains(row)) Console.WriteLine("Already in data set");
    hash.Add(row);
}