比较两个数据表和第二个数据表中更新的常用值

本文关键字:数据表 第二个 更新 常用值 比较 两个 | 更新日期: 2023-09-27 18:35:51

我有两个DataTable,我想从第一个中选择第二个数据表中存在的行

例如:

表 1

 ColA1   ColA2
 1      sampletext1
 2      sampletext2
 4      sampletext4

表 2

ColA1   ColA2
 1      
 2  
 2    

我想要这样的输出:

表 2

ColA1   ColA2
 1      sampletext1
 2      sampletext2
 2      sampletext2

我尝试下面的代码,但它不起作用

foreach (DataRow dr in dtprofit.Rows)    
{  
    DataRow[] Selected = dtAccount.Select("AccDesc= '" + dr["Account"] + "' ");
    if(Selected.Length>0)
    {
        dr["Type"] = Selected[0]["AccType"];    
    }
}

提前谢谢。

比较两个数据表和第二个数据表中更新的常用值

您可以使用此 LINQ 查询来连接两个表:

var commonRows = from row1 in Table1.AsEnumerable()
                 join row2 in Table2.AsEnumerable()
                 on row1.Field<int>("ColA1") equals row2.Field<int>("ColA1")
                 select new { row2, newValue = row1.Field<string>("ColA2") };
foreach (var commonRowInfo in commonRows)
{
    commonRowInfo.row2.SetField("ColA2", commonRowInfo.newValue);
}

结果:

1   sampletext1
2   sampletext2
2   sampletext2

这是另一种(可能效率较低)的方法:

var t1Rows = Table1.AsEnumerable();
foreach (DataRow row in Table2.Rows)
{
    DataRow row1 = t1Rows.FirstOrDefault(r => 
        row.Field<int>("ColA1") == r.Field<int>("ColA1"));
    if (row1 != null)
        row.SetField("ColA2", row1.Field<string>("ColA2"));
}

最后但并非最不重要的一点是,下面是一种没有 LINQ 的方法,即使在 .NET 1.1 中也有效:

foreach (DataRow row in Table2.Rows)
{
    DataRow[] rows = Table1.Select("ColA1=" + row["ColA1"]);
    if (rows.Length >= 1)
        row["ColA2"] = rows[0]["ColA2"];
}

试试这个:

var table1Dic = table1.AsEnumerable().ToDictionary(dr => dr.Field<int>("ColA1"), dr => dr.Field<string>("ColA2"));
foreach (var row in table2.AsEnumerable()) {
    var key = (int)row["ColA1"];
    if (table1Dic.ContainsKey(key))
        row.SetField<string>("ColA2", table1Dic[key]);
}

首先,获取两个数据表中共有的所有记录(不需要两个数据表的结构相同)。若要选择公用行,请使用此代码。

   var sameRecords = from table1 in dtFirst.AsEnumerable() join table2 in  secondDt.AsEnumerable() on table1.Field<string>("abc") equals table2.Field<string>("def") where table1.Field<string>("abc") == table2.Field<string>("def") select table1;
        if (sameRecords .Count() > 0)
        {
           //Copy selected recors to the Data Table object
            DataTable dt =sameRecords .CopyToDataTable();
        }

现在,您拥有根据设置的标准在两个数据表中共有的所有记录。用于更新结果 DT 对象中的记录 迭代行并像这样操作您想要的任何内容

foreach (DataRow row in dt.Rows)
{
 //Place your code
}

干杯。。。。。。。。。。。快乐编码