C# 比较不同表的数据行
不久前我发布了一篇文章,决定降低它的复杂性,让开发人员回答我的主要问题。它可以说是重复的,但我仍然想发布它,因为编辑前一篇文章并没有产生太多的结果 我有两个数据表:dataTable1和dataTable2。两者都有一行具有相同的条目。例如,两个数据表中的列都是Name、Class、Subject。现在,两个数据表的两行都有相同的值(“John”、“5”、“Science”)。现在我想比较这两行是否有相同的条目。我试图:C# 比较不同表的数据行,c#,winforms,c#-4.0,datatable,datarow,C#,Winforms,C# 4.0,Datatable,Datarow,不久前我发布了一篇文章,决定降低它的复杂性,让开发人员回答我的主要问题。它可以说是重复的,但我仍然想发布它,因为编辑前一篇文章并没有产生太多的结果 我有两个数据表:dataTable1和dataTable2。两者都有一行具有相同的条目。例如,两个数据表中的列都是Name、Class、Subject。现在,两个数据表的两行都有相同的值(“John”、“5”、“Science”)。现在我想比较这两行是否有相同的条目。我试图: if(dataTable1.Rows[0].GetHashCode() =
if(dataTable1.Rows[0].GetHashCode() == dataTable2.Rows[0].GetHashCode())
{
// Result is false (but I expected it to be true)
}
并尝试:
if(dataTable1.Rows[0].ItemArray == dataTable2.Rows[0].ItemArray)
{
// Result is false (but I expected it to be true)
}
我想避免循环,但如果需要也可以。我只想比较两个不同数据表的两行,看看它们的条目是否相同。我不知道该如何进行。谢谢
var result= dataTable1.AsEnumerable().Intersect(dataTable2.AsEnumerable(),
DataRowComparer.Default);
它返回两个表中的记录
更多信息,请访问:
为了简单起见,我通常会将
项目数组中的项目转换为字符串,并以这种方式进行比较。
据我所知,使用GetHashCode不会产生与许多其他人所说的相同的结果。
如果您有大量的行,那么您可以尝试创建一个继承自DataRow
的类,并重写Equals方法。例如:
类CustomRow:DataRow
{
public override bool Equals(对象对象对象)
{
if(obj.GetType()!=typeof(CustomRow))返回false;
for(int i=0;i
另一个选项是:
DataView dv = new DataView(dataTable1);
dv.Filter = "SQL query to find specific row"
当然,对于您将要找到的每个原始数据,您可以使用DataRowComparer
的Equals
来比较行。使用SequenceEqual比较两个数据行,如下例所示
foreach (DataRow dr in datatable1.Rows)
foreach (DataRow dr2 in datatable2.Rows)
{
if (dr.ItemArray.SequenceEqual(dr2.ItemArray))
{
MessageBox.Show("dr = dr2");
//statement
}
else
{
MessageBox.Show("dr != dr2");
//statement
}
}
从.NET3.5开始就可以使用,但您找不到如何使用它的示例。现在您可以:
bool tf;
// Unbelievable...
DataRowComparer<DataRow> drc = DataRowComparer.Default;
DataTable tbl;
tbl = new DataTable();
tbl.Columns.Add("One", typeof(string));
tbl.Columns.Add("Two", typeof(string));
tbl.Columns.Add("Three", typeof(string));
tbl.Rows.Add("One", "Two", "Three");
tbl.Rows.Add("One", "Two", "Three");
tbl.Rows.Add("One", "Three", "Two");
tbl.Rows.Add("One", "Two");
tbl.Rows.Add("One", "Two");
tf = dc.Equals(tbl.Rows[0], tbl.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl.Rows[2]);
tbl2 = new DataTable();
tbl2.Columns.Add("One", typeof(string));
tbl2.Columns.Add("Two", typeof(string));
tbl2.Columns.Add("Nine", typeof(string)); // Diff col name
tbl2.Rows.Add("One", "Two", "Three");
tbl2.Rows.Add("One", "Two", "Three");
tbl2.Rows.Add("One", "Three", "Two");
tbl2.Rows.Add("One", "Two");
tbl2.Rows.Add("One", "Two");
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[0]);
tf = dc.Equals(tbl.Rows[1], tbl2.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[2]);
您是要比较两个特定行,还是要查找两个相等的任意行。在代码中,您比较两个指针,因此得到的结果为false。根据我的要求,我要比较特定行。但对于任意行的回答应该更受欢迎。然而我觉得,两者应该有相同的概念,用不同的方法进行比较?你能再描述一下吗?我觉得,这就像是在搜索某样东西,而不是比较。比较是在搜索相似的东西。从这个角度看,它与其他解决方案一样。在intersect之后,我认为它应该是dataTable2
。在您的情况下,如果结果不为空,则意味着在两个dable@MassimilianoPeluso你的答案似乎回答了rapslands最初的问题,也许你应该加上:-):谢谢…帮了我大忙,不知道为什么我没有选择DataRowComparer
bool tf;
// Unbelievable...
DataRowComparer<DataRow> drc = DataRowComparer.Default;
DataTable tbl;
tbl = new DataTable();
tbl.Columns.Add("One", typeof(string));
tbl.Columns.Add("Two", typeof(string));
tbl.Columns.Add("Three", typeof(string));
tbl.Rows.Add("One", "Two", "Three");
tbl.Rows.Add("One", "Two", "Three");
tbl.Rows.Add("One", "Three", "Two");
tbl.Rows.Add("One", "Two");
tbl.Rows.Add("One", "Two");
tf = dc.Equals(tbl.Rows[0], tbl.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl.Rows[2]);
tbl2 = new DataTable();
tbl2.Columns.Add("One", typeof(string));
tbl2.Columns.Add("Two", typeof(string));
tbl2.Columns.Add("Nine", typeof(string)); // Diff col name
tbl2.Rows.Add("One", "Two", "Three");
tbl2.Rows.Add("One", "Two", "Three");
tbl2.Rows.Add("One", "Three", "Two");
tbl2.Rows.Add("One", "Two");
tbl2.Rows.Add("One", "Two");
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[0]);
tf = dc.Equals(tbl.Rows[1], tbl2.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[1]);
tf = dc.Equals(tbl.Rows[0], tbl2.Rows[2]);
tbl.Rows[0].ItemArray.SequenceEquals(tbl.Rows[1]);