循环遍历2个数据表,并将值添加到第三个

本文关键字:三个 添加 2个 遍历 数据表 循环 | 更新日期: 2023-09-27 18:20:54

我创建了3个数据表

var dt1= new DataTable();
var dt2= new DataTable();
var dt3= new DataTable();

然后我循环

       foreach (DataRow row1 in dt1.Rows)
       {
          dt3.Rows.Add(row1.ItemArray);
           foreach (DataRow row2 in dt2.Rows)
           {
              var Id2 = row1["Id"];
              var Id1= row2["Id"];
              if (Id1 == Id2)
              {
                 dt3.rows["Name"] = "" ; // doesnt work       
               }
           }
       }

正如您所看到的,我在2个数据表上循环。然后在内部循环中,我检查记录是否匹配。现在,如果记录匹配,那么我想更新dt3数据表上的列"Name"。

我试过使用

 dt3.rows["Name"] = "" ; 

但这行不通。我知道原因是因为我再次需要在dt3数据表上循环将值分配给该循环中的列。但不确定如何做到这一点,以及是否有更好的解决方案。我的意思是,我们可以在dt3数据表中找到id,然后更新值。但不知道该怎么做有没有比在2张表上循环更智能的解决方案?

循环遍历2个数据表,并将值添加到第三个

不需要第一个foreach。一个简单的DataTable.Copy将把原始表中的所有数据和结构带到目标表中。然后在第二个表上循环,在第三个表上选择以查找匹配的行并清除名称。

dt3 = dt1.Copy();
foreach (DataRow row2 in dt2.Rows)
{
    DataRow[] match = dt3.Select("ID=" + row2["ID"].ToString());
    if(match.Lenght > 0)
        match[0]["Name"] = "" ;        
}

不确定这是否比其他答案更有表现力。需要测试

dt3.rows不起作用,您需要更改现在添加的行的名称。这应该有效:

foreach (DataRow row1 in dt1.Rows)
{
    DataRow newRow = dt3.Rows.Add(row1.ItemArray);
    foreach (DataRow row2 in dt2.Rows)
    {
        var Id2 = row1["Id"];
        var Id1 = row2["Id"];
        if (Id1 == Id2)
        {
            newRow["Name"] = "new Name";
        }
    }
}

试试这个:

   foreach (DataRow row1 in dt1.Rows)
   {
      var row = dt3.Rows.Add(row1.ItemArray);
       foreach (DataRow row2 in dt2.Rows)
       {
          var Id2 = row1["Id"];
          var Id1= row2["Id"];
          if (Id1 == Id2)
          {
              row["Name"] = ""; //maybe works
           }
       }
   }

怎么样,

   dt2Lookup = new HashSet(
       dt2.AsEnumerable().Select(row => row.Field<int>("Id")));
   dt3 = dt1.Clone();
   forreach (var row In dt1.AsEnumerable())
   {
      var newRow = dt3.Rows.Add(row.ItemArray)
      if (dt2lookup.Contains(row.Field<int>("Id"))
      {
           newRow.SetField("Name", string.Empty);
      }
   }

HashSet应当提供良好的查找性能。

    dt3 = dt1.Copy();
    var RowDictionary = dt3.Rows.OfType<DataRow>().ToDictionary(dr => dr["ID"].ToString());
    //replace by Dictionary<string,List<DataRow>> in case ID is not unique and fill it with a foreach loop.
    foreach (DataRow row2 in dt2.Rows)
    {
            DataRow Match;
            if (c.TryGetValue(row2["ID"].ToString(), out Match)) 
            { 
               Match["Name"] = "";
            }
    }

您应该调用:

dt3.rows[dt3.rows.Count - 1].Columns["Name"] = "" ;