gpt4 book ai didi

c# - 比较 2 个数据表以查找列之间的差异/准确性

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:05 25 4
gpt4 key购买 nike

因此,我有 2 个独立的数据表,它们看起来非常相同,但它们行中的值可能不同。

编辑:

我可以通过创建一个可以用作主键的临时标识列来获得唯一 ID,如果这样做更容易的话。所以将 ID 列视为主键。

表A

ID |  Name | Value1 | Value2 | Value3
-------------------------------------
1 | Bob | 50 | 150 | 35
2 | Bill | 55 | 47 | 98
3 | Pat | 10 | 15 | 45
4 | Cat | 70 | 150 | 35

表B

ID |  Name | Value1 | Value2 | Value3
-------------------------------------
1 | Bob | 30 | 34 | 67
2 | Bill | 55 | 47 | 98
3 | Pat | 100 | 15 | 45
4 | Cat | 70 | 100 | 20

输出应该是:

表 C

ID |  Name | TableAValue1 | TableBValue1 | DiffValue1 ....Samething for Value2 .....samething for value3
------------------------------------------------------
1 | Bob | 50 | 30 | 20
2 | Bill | 55 | 55 | 0
3 | Pat | 10 | 100 | 90
4 | Cat | 70 | 70 | 0

我知道执行此操作的繁琐方法是使用 forloop 并循环遍历每一行,将列行相互比较。但我不确定如何用我想要的结果创建一个新的表 C。此外,我认为可能有一个使用 Linq 的更简单的解决方案,我不是很熟悉,但如果它更快且代码行更少,我会对使用 linq 的解决方案感兴趣. 我正在寻找解决此问题的最优化/最有效的方法。因为这些数据表的大小可能在 5,000 到 15,000 多行之间,所以内存使用成为一个问题。

最佳答案

LINQ 并不快,至少一般情况下不会。但它有助于提高可读性。

您可以使用 Enumerable.Join,这可能比嵌套循环更有效,但无论如何您都需要一个循环来填充您的第三个表。所以前两列是标识符,其余的是值:

var query = from r1 in table1.AsEnumerable()
join r2 in table2.AsEnumerable()
on new { ID = r1.Field<int>("ID"), Name = r1.Field<string>("Name") }
equals new { ID = r2.Field<int>("ID"), Name = r2.Field<string>("Name") }
select new { r1, r2 };

var columnsToCompare = table1.Columns.Cast<DataColumn>().Skip(2);

foreach (var rowInfo in query)
{
var row = table3.Rows.Add();
row.SetField("ID", rowInfo.r1.Field<int>("ID"));
row.SetField("Name", rowInfo.r1.Field<int>("Name"));
foreach (DataColumn col in columnsToCompare)
{
int val1 = rowInfo.r1.Field<int>(col.ColumnName);
int val2 = rowInfo.r2.Field<int>(col.ColumnName);
int diff = (int)Math.Abs(val1-val2);
row.SetField(col.ColumnName, diff);
}
}

关于c# - 比较 2 个数据表以查找列之间的差异/准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22666138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com