我正在尝试将DataTable dt1的副本复制到新的dt2。 dt1包含字符串和布尔类型的列。 dt2将只包含字符串类型。
以下是我的代码,它可以正常工作。
var endDate = "May 01, 2016 00:00:00";
是否有更好的方法来执行这些步骤。 “更好”意味着更清晰,更简单,更少代码,更少步骤,更好的性能。
答案 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)
您提供的代码非常清楚地描述了您的意图并且简明扼要。但是,我们可以进行一些有助于提高性能的优化。
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
块。