1

2 つDataTableの があり、2 番目のデータ テーブルに存在する最初の行から行を選択したい

例えば:

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

前もって感謝します。

4

3 に答える 3

2

両方のテーブルを結合するこの 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"));
}

最後になりましたが、.NET 1.1 でも機能する LINQ を使用しないアプローチを次に示します。

foreach (DataRow row in Table2.Rows)
{
    DataRow[] rows = Table1.Select("ColA1=" + row["ColA1"]);
    if (rows.Length >= 1)
        row["ColA2"] = rows[0]["ColA2"];
}
于 2013-10-17T13:51:58.827 に答える
0

これを試して:

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]);
}
于 2013-10-17T13:52:05.050 に答える