2016-03-30 15 views
0

DataTable dt1のコピーを新しいdt2に作成しようとしています。 dt1には、文字列とブール型の列が含まれています。 dt2には文字列型のみが含まれます。いくつかの変更を加えてDatatableのコピーを作成する

以下は、正常に動作する私のコードです。

public DataTable Convert(DataTable dt1) 
    { 
     try 
     { 
      var dt2 = dt1.Clone(); 
      foreach (DataColumn dc in dt2.Columns) 
      { 
       dc.DataType = Type.GetType("System.String"); 
      } 

      foreach (DataRow row in dt1.Rows) 
      { 
       dt2.ImportRow(row); 
      } 

      foreach (DataRow dr in dt2.Rows) 
      { 
       foreach (DataColumn dc in dt2.Columns) 
       { 
        bool value; 
        if (bool.TryParse(dr[dc].ToString(), out value)) 
        { 
         dr[dc] = "+"; 
        } 
       } 
      } 

      return dt2; 
     } 
     finally 
     { 

     } 
    } 
  • 第一ステップ:DT1のクローンと文字列に列の種類を変更します。
  • 第二ステップ:
  • 第三ステップをDT2するDT1から行をインポートします。すべての真の値を変更するには「+」

これらの手順を実行するためのより良い方法があります。 「より良い」とは、より明確でシンプルでコードが少なく、ステップ数が少なく、パフォーマンスが優れています。

+0

パフォーマンスに問題がありますか?行に1つのループしか実装しないで、行をインポートして後で更新することができます。しかし、両方のデータ型は同じ構造ではないので、新しい行を作成して、コピー・フィールドを作成することは、状態や必要なものがない場合にはより効果的です。 –

+0

行に2回、列に2回ループするのではなく、別の解決策があるのだろうかと思いました – ehh

答えて

1

あなたが提供したコードは、あなたの意図を簡潔に示しています。ただし、パフォーマンスに役立ついくつかの最適化を行うことができます。

  1. どのフィールドに実際に操作が必要かを判断するのではなく、すべての行のすべてのフィールドを解析しようとしています。非ブール値の列の数が増えるにつれ、必要以上に多くの作業が行われます。
  2. 元のテーブルにはすでにboolの値が含まれていますので、すべてを解析する必要はありません。

ここでは、この2つの点を中心に最適化されたバージョンがあります。コードは短くないかエレガントではありませんが、テキストの解析や評価の必要はほとんどありません。あなたがそれを使用していないので、

public DataTable Convert2(DataTable dt1) 
{ 
    DataTable dt2 = dt1.Clone(); 

    // Alter all columns datatype 
    foreach (DataColumn col in dt2.Columns) 
     col.DataType = typeof(string); 

    // Import all rows from existing table 
    foreach (DataRow row in dt1.Rows) 
     dt2.ImportRow(row); 

    // Index the boolean columns that will require evaluation 
    List<int> booleans = new List<int>(); 
    foreach (DataColumn col in dt1.Columns) 
    { 
     if (col.DataType == typeof(bool)) 
      booleans.Add(col.Ordinal); 
    } 

    // Since two tables will be identical except for datatypes 
    // iterate over original table and cast instead of performing 
    // a string conversion and parsing the result. 
    for (int row = 0; row < dt1.Rows.Count; row++) 
    { 
     foreach (int index in booleans) 
     { 
      if ((bool) dt1.Rows[row][index]) 
       dt2.Rows[row][index] = "+"; 
     } 
    } 

    return dt2; 
} 

また、私はtry..finallyブロックを残しました。

1

そのコードは仕事をするでしょう。

public DataTable Convert(DataTable dt1) 
{ 
    try 
    { 
     var dt2 = dt1.Clone(); 
     foreach (DataColumn dc in dt2.Columns) 
     { 
      dc.DataType = Type.GetType("System.String"); 
     } 

     foreach (DataRow row in dt1.Rows) 
     { 
      dt2.ImportRow(row); 
      DataRow dr = dt2.Rows[dt2.Rows.Count-1] 
      foreach (DataColumn dc in dt2.Columns) 
      { 
       bool value; 
       if (bool.TryParse(dr[dc].ToString(), out value)) 
       { 
        dr[dc] = "+"; 
       } 
      } 
     } 

     return dt2; 
    } 
    finally 
    { 

    } 
} 
関連する問題