比较不同表的数据行

时间:2012-01-30 13:18:07

标签: c# winforms c#-4.0 datatable datarow

我前段时间发布了similar query并决定降低其复杂性,让开发人员回答我的主要问题。它可以说是重复的,但我仍然希望将其发布为编辑上一篇文章并没有产生太多结果。

我有2个数据表:dataTable1和dataTable2。两者都有1行具有相同的条目。例如。两个数据表中的列都是Name,Class,Subject。现在两个dataTable的行都与值相同(“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) 
} 

我想避免循环来做,但如果需要,那很好。我只想比较2行不同的数据表,如果他们的条目相同或不相同。我不知道该怎么办。感谢。

6 个答案:

答案 0 :(得分:3)

您可以使用Equals methodDataRowComparer class来比较行。

答案 1 :(得分:2)

var result= dataTable1.AsEnumerable().Intersect(dataTable2.AsEnumerable(),
                                                    DataRowComparer.Default);

它返回表中的记录

更多信息:

http://msdn.microsoft.com/en-us/library/bb386998.aspx

答案 2 :(得分:1)

使用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
        }
    }

答案 3 :(得分:0)

为简单起见,我通常只会将ItemArray中的项目转换为字符串,然后按照这种方式进行比较。
根据我的记忆,使用GetHashCode 会显示出与其他人会说的相同的结果。
如果您有大量行,则可以尝试创建一个继承自DataRow的类并覆盖Equals方法。例如:
class CustomRow : DataRow {

    public override bool Equals(object obj)
    {
        if(obj.GetType() != typeof(CustomRow)) return false;
        for (int i = 0; i < ItemArray.Length; i++)
            if (((CustomRow)obj)[i] != this[i])
                return false;

        return true;
    }
}

public override bool Equals(object obj) { if(obj.GetType() != typeof(CustomRow)) return false; for (int i = 0; i < ItemArray.Length; i++) if (((CustomRow)obj)[i] != this[i]) return false; return true; } }

答案 4 :(得分:0)

另一种选择是:

DataView dv = new DataView(dataTable1); 
dv.Filter = "SQL query to find specific row"

这自然就是你要找到的每一个原始

答案 5 :(得分:0)

DataRowComparer自.NET 3.5开始可用,并非您可以找到使用它的示例。现在您可以:

df %>%
  mutate(Result = ifelse(Date1 < Date2, "Yes", "No"))
#> # A tibble: 8 x 4
#>      ID Date1      Date2      Result
#>   <dbl> <date>     <date>     <chr> 
#> 1     1 2019-09-10 2019-09-09 No    
#> 2     1 2019-12-11 2019-12-01 No    
#> 3     1 NA         2019-12-08 <NA>  
#> 4     2 2019-09-11 2019-09-25 Yes   
#> 5     2 2019-11-05 2019-11-15 Yes   
#> 6     2 2019-12-05 NA         <NA>  
#> 7     3 2019-09-19 2019-09-11 No    
#> 8     3 2019-10-22 2019-10-17 No

但是我喜欢这样做,并且喜欢DataRowComparer实例化-我需要看到性能上的优势。

HttpContext.Current.Request.Headers