2013-07-04 27 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"] = ""; 
      } 
    }