Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较不同表的数据行_C#_Winforms_C# 4.0_Datatable_Datarow - Fatal编程技术网

C# 比较不同表的数据行

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() =

不久前我发布了一篇文章,决定降低它的复杂性,让开发人员回答我的主要问题。它可以说是重复的,但我仍然想发布它,因为编辑前一篇文章并没有产生太多的结果

我有两个数据表:dataTable1和dataTable2。两者都有一行具有相同的条目。例如,两个数据表中的列都是Name、Class、Subject。现在,两个数据表的两行都有相同的值(“John”、“5”、“Science”)。现在我想比较这两行是否有相同的条目。我试图:

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]);