通过一些更改制作数据表的副本

时间:2016-03-30 09:57:58

标签: c# winforms linq datatable

我正在尝试将DataTable dt1的副本复制到新的dt2。 dt1包含字符串和布尔类型的列。 dt2将只包含字符串类型。

以下是我的代码,它可以正常工作。

var endDate = "May 01, 2016 00:00:00";
  • 第1步:克隆dt1并将列类型更改为字符串。
  • 第二步:将行从dt1导入到dt2
  • 第3步:将所有真值更改为“+”

是否有更好的方法来执行这些步骤。 “更好”意味着更清晰,更简单,更少代码,更少步骤,更好的性能。

2 个答案:

答案 0 :(得分: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
    {

    }
}

答案 1 :(得分:1)

您提供的代码非常清楚地描述了您的意图并且简明扼要。但是,我们可以进行一些有助于提高性能的优化。

  1. 您正在尝试解析每一行的每个字段,而不是确定哪些字段实际需要操作。随着非布尔列数量的增加,您所做的工作量超出了所需的数量。
  2. 您已经拥有包含bool值的原始表,因此您可以放弃一起解析。
  3. 这是一个围绕这两点进行优化的版本。代码不短或更优雅,但它不需要文本解析和更少的评估。

    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块。