我有一个DataTable,其中有几个DataRow我想在新的DataTable中格式化,但是在尝试格式化某些行时发现了一个问题:

DataTable ret = functionThatGetsaDataTableUsingSQL(); //Original DataTable
DataTable dt = new DataTable(); //Final DataTable
foreach (DataRow dr in ret.Rows)
{
    DataRow row = dt.Rows.Add();
    for (int j = 0; j < dr.ItemArray.Length; j++)
    {
        if (j == 14) row[j] = dr.ItemArray[j].ToString("C2");
        else row[j] = dr.ItemArray[j];
    }
}


row[j] = dr.ItemArray[j].ToString("C2");不能显示No overload for method 'ToString' takes 1 arguments

我试图尽可能简化代码,以便仅关注格式化部分。

如何格式化该值?我知道我可以在使用Convert.ToDecimal()之前先投射ToString("C2"),但这是唯一的方法吗?

最佳答案

ItemArrayobject[]Object.ToString没有参数。我想这实际上是一种货币价值。然后使用DataRow.Field扩展方法进行转换:

foreach (DataRow dr in ret.Rows)
{
    DataRow row = dt.Rows.Add();
    for (int j = 0; j < dr.ItemArray.Length; j++)
    {
        if (j == 14)
            row[j] = dr.Field<decimal>(j).ToString("C2"); // use the correct type
        else
            row[j] = dr.ItemArray[j];
    }
}


这是一个优化的版本,ItemArray-property具有额外的开销,因为getter总是创建一个新数组(如您看到的here):

foreach (DataRow dr in ret.Rows)
{
    DataRow row = dt.Rows.Add();
    foreach(DataColumn col in ret.Columns)
    {
        if (col.Ordinal == 14)
            row.SetField(col.Ordinal, dr.Field<decimal>(col).ToString("C2")); // use the correct type
        else
            row.SetField(col.Ordinal, dr[col]);
    }
}

关于c# - ItemArray转换为格式无效的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35648950/

10-12 22:14
查看更多