2013-07-04 26 views
0

我已经建立3个数据表循环通过2个数据表和增加值,第三

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 datatable中找到id,然后更新值。但不知道如何去做 有没有比循环2表更智能的解决方案?

+0

为什么要使用'DataTable'? – Jodrell

+0

@Jodrell所以我应该使用什么?我使用数据表,因为我从sql查询中获取动态列。我尝试使用列表,但不知道如何使它与动态列一起工作。 – Happy

+0

这个问题没有提到动态数据,你的'dt1'和'dt2'组合的结果是否需要成为'DataTable'? – Jodrell

回答

0

你应该叫:

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

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"; 
     } 
    } 
} 
+1

也许外部循环可以用一个DataTable.Copy替换来找到匹配? – Steve

+0

@Steve如何做到这一点? – Happy

0

试试这个:不需要

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 
      } 
     } 
    } 
2

第一的foreach。简单的DataTable.Copy将从目标表中的原始表中获取所有数据和结构。然后在第二个表上循环并在第三个表上找到Select以找到匹配的行并清除名称。

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

不知道这是否是从其他答案更高性能。需要进行测试

+0

这真的很棒@Steve。将尝试,如果它的工作。似乎是惊人的逻辑。 +1 – Happy

+0

但是这样你就可以在dt2中的每一行循环dt3 ..这是(dt2.Rows.Count * dt2.Rows.Count)迭代。这对于大数据无效,因为您只需要循环dt3两次即可完成工作。 –

+0

@Steve它的工作,但我有问题。如果记录不匹配,那么我需要将一些值从dt3复制到dt2。不知道如何实现它 – Happy

1

怎么样,

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应提供良好的查找性能。

1
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"] = ""; 
      } 
    }