【问题标题】:Convert datatable column to list将数据表列转换为列表
【发布时间】:2018-10-30 11:41:31
【问题描述】:

我构建了将特定数据表列值转换为特定类型列表的方法,最类似于字符串列表。然而,当数据表列是decimal 或任何其他类型时,我遇到的问题是List<string> 我想得到结果,例如:十进制到字符串异常。我应该在我的方法中改变什么来解决这个问题?

//for example here colname is decimal i want still my list to be List<string> containing that decimals as strings
    var myList = GetSpecificColumnValuesFromDatatableToList<string>(mydt, "colname");

    public List<T> GetSpecificColumnValuesFromDatatableToList<T>(DataTable datatable, string colName)
    {
         List<T> list = datatable.AsEnumerable().Select(r => r.Field<T>(colName)).ToList();          
         return list;
    }

【问题讨论】:

  • 不要使用string。使用正确的类型,例如GetSpecificColumnValuesFromDatatableToList&lt;decimal&gt;
  • 但是我会得到十进制列表。请注意,我想获取字符串列表,在这种特殊情况下,我的数据表列是十进制类型,因此必须以某种方式将此列十进制转换为字符串。
  • 您仍然必须使用&lt;decimal&gt;,因为该值不是字符串并且无法转换为字符串。您需要使用ToString()String.Format 将小数格式化为字符串,例如在Select 中:GetSpecificColumnValuesFromDatatableToList&lt;decimal&gt;().Select(d=&gt;d.ToString("#00.00")).ToList();。或者在调用 ToList 之前创建一个不同的方法来执行此操作
  • 您的方法可能应该是 List ,因此 T 可以是十进制的,或者引入另一个通用 T2 以将 return 与 convert 分开。
  • 问题使用了错误的类型。解决方案是使用 正确的 类型。如果要将小数格式化 为字符串,则需要使用正确的方法。如果您希望该方法仅返回字符串,则应在其 Select lambda 中调用 ToString()

标签: c# datatable


【解决方案1】:

您可以向您的方法添加更多级别的泛型并提供转换器表达式,以便您可以将整个值列表转换为您想要的类型。

var myList = GetSpecificColumnValuesFromDatatableToList<decimal, string>(mydt, "colname", v => c.ToString("0.##"));

public List<TResult> GetSpecificColumnValuesFromDatatableToList<TColumn, TResult>(DataTable datatable, string colName, Func<TColumn, TResult> converter)
{
     return datatable.AsEnumerable().Select(r => converter(r.Field<TColumn>(colName))).ToList();          
}

为了更方便,我建议将其作为扩展方法:

var myList = mydt.ConvertColumn<decimal, string>("colname", v => v.ToString("0.##"));

static class DataTableExtension 
{
    public static List<TResult> ConvertColumn<TColumn, TResult>(this DataTable datatable, string colName, Func<TColumn, TResult> converter)
    {
         return datatable.AsEnumerable().Select(r => converter(r.Field<TColumn>(colName))).ToList();          
    }
}

【讨论】:

  • 嗨,我真的需要知道什么是数据表列类型吗?问是因为我们有不同列类型的庞大数据表。难道只是我想对这种格式说,而不是说数据表列类型是什么?
  • 如果您只想将列值转换为不带任何格式的字符串,并且您永远不需要在类型之间进行转换(例如,将 long(bigint) 列转换为 short(tinyint)),那么您不需要不必编写方法。只需在任何地方使用此行: datatable.AsEnumerable().Select(r => r.Field(colName).ToString())
猜你喜欢
  • 2020-04-17
  • 2022-11-14
  • 2012-04-07
相关资源
最近更新 更多