2016-03-30 49 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的克隆和更改列類型爲字符串。
  • 第2步:從DT1導入行DT2
  • 第三步:將所有真值「+」

有沒有執行這些步驟的更好的方法。 「更好」意味着更清晰,更簡單,代碼更少,步驟更少,性能更好。

+0

您是否有性能問題?您可以嘗試在行上只實現一個循環,導入行並在之後進行更新。但是這兩個數據表的結構都不一樣,所以如果你不需要狀態或者什麼都不需要,那麼創建一個新行和複製字段會更好。 –

+0

我想知道是否有另一種解決方案,而不是在行上循環兩次,在列上循環兩次 – ehh

回答

1

您提供的代碼非常清晰地描述了您的意圖,並且簡潔。然而,我們可以做一些優化,這將有助於提高性能。

  1. 您試圖解析每一行的每個字段,而不是確定哪些字段實際上需要操作。隨着非布爾列數量的增加,您正在做的工作比需要的多。
  2. 您已經擁有包含bool值的原始表格,因此您可以不必一起解析。

以下是圍繞這兩點進行優化的版本。代碼不會更短或更優雅,但它不需要文本解析和更少的評估。

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 
    { 

    } 
} 
相關問題