1

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 データテーブルの列「名前」を更新します。

使ってみた

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

しかし、これはうまくいきません。その理由は、dt3 データテーブルを再度ループして、そのループ内の列に値を割り当てる必要があるためです。しかし、それを行う方法と、さらに良い解決策があるかどうかはわかりません。つまり、dt3 データテーブルで id を見つけて、値を更新できます。しかし、それを行う方法がわからない 2つのテーブルでループするよりもインテリジェントなソリューションはありますか?

4

6 に答える 6

2

最初の foreach は必要ありません。単純なDataTable.Copyは、元のテーブルのすべてのデータと構造をコピー先テーブルに取り込みます。次に、2 番目のテーブルをループし、3 番目のテーブルを選択して一致する行を見つけ、名前をクリアします。

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

これが他の回答よりもパフォーマンスが高いかどうかはわかりません。テストする必要があります

于 2013-07-04T08:48:21.940 に答える
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";
        }
    }
}
于 2013-07-04T08:38:24.487 に答える
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"] = "";
            }
    }
于 2013-07-04T09:35:55.733 に答える
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、優れたルックアップ パフォーマンスを提供する必要があります。

于 2013-07-04T09:17:56.573 に答える
1

これを試して:

   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
           }
       }
   }
于 2013-07-04T08:42:41.153 に答える
0

あなたは呼び出す必要があります:

dt3.rows[dt3.rows.Count - 1].Columns["Name"] = "" ; 
于 2013-07-04T08:36:23.180 に答える