1
first table:dtHeader
 Header
---------
Address
ZipCode
city
state


Second table:-dtReport

RowNumber-----Address------Zipcode---Region------city

   1200       JC           00000     NYC         Bronx

   13000       RC            12345    NC          Boston

columnname が dtHeader にない dtreport のすべての列を削除したいので、結果の dtReport には Address--zipcode--city 列のみが含まれます。多数の行、つまり70000があるため、別のデータテーブルを作成したくありません。どうすればこれを達成できますか?

4

3 に答える 3

1

Enumerable.Exceptから削除する必要があるすべての列名を見つけるために使用できますdtReport

var notAllowedColNames = dtReport.Columns.Cast<DataColumn>()
    .Select(c=> c.ColumnName.ToUpperInvariant())
    .Except(dtHeader.AsEnumerable().Select(r => r.Field<String>("Header").ToUpperInvariant()))
    .ToList();
foreach(var colName in notAllowedColNames) 
     dtReport.Columns.Remove(colName);

両方の表で大文字と小文字が異なるToUpperInvariantため、使用しました。ZipCode

于 2013-06-21T20:26:05.330 に答える
1

テストされていませんが、dtHeader 列コレクションに同じ名前の列が含まれているかどうかをチェックする dtReport 列コレクションの単純なループです。そうでない場合は、dtReport から列を削除します。

    SqlCommand cmdHeader = new SqlCommand("SELECT * FROM Header", conn);
    SqlCommand cmdReport = new SqlCommand("SELECT * FROM Report", conn);
    DataTable dtHeader = new DataTable();
    DataTable dtReport = new DataTable();
    SqlDataAdapter da1 = new SqlDataAdapter(cmdHeader);
    da1.Fill(dtHeader)
    SqlDataAdapter da2 = new SqlDataAdapter(cmdReport);
    da2.Fill(dtReport);

    for(int x = dtReport.Columns.Count - 1; x >= 0; x--)
    {
        DataColumn dc = dtReport.Columns[x];
        if(!dtHeader.Columns.Contains(dc.ColumnName))
             dtReport.Columns.Remove(dc.ColumnName);
    }

トリックは、最後の列から最初の列への for.. ループを使用することです。このようにして、コレクションを繰り返し処理しながら列を削除できます (foreach はこれを実行できません)。

于 2013-06-21T20:24:27.387 に答える