通过扩展方法将DataTable转换为字符串数组

时间:2017-05-25 08:13:11

标签: c# arrays linq datatable

我知道有很多类似的线程,但我的要求没什么不同。基本要求是将DataTable转换为字符串数组。我可以通过创建一个Extension方法为我做这项工作来做到这一点。

public static class ExtensionMethods
{
     public static object ToStringArray(this DataTable dt, params object[] columns)
     {
          //if specifically columns are provided then returns item array values for these columns.
          if (columns != null && columns.Length > 0)
          {
              //return dt.AsEnumerable().Select(x => new[] { //here i want to iterate through columns params }).ToArray();
          }
          else
          {
               return dt.AsEnumerable().Select(x => new[] { x.ItemArray }).ToArray();
          }
      }    
}

如果我没有明确提供列名,那么它会将所有行值完美地返回为strings数组。

var dtData = dataTable.ToStringArray();

但是,如果我提供列名

,该怎么办?
var dtData = dataTable.ToStringArray("Column1", "Column2", "Column3");

然后如何迭代columns以获取此代码块中仅提供的列值

if (columns != null && columns.Length > 0)
{
     return dt.AsEnumerable().Select(x => new[] { //here i want to iterate through columns params }).ToArray();
}

我知道我可以通过硬编码列名来做到这一点,如下所示:

var dtData = dt.AsEnumerable().Select(x => new[] { x["Column1"], x["Column2"], x["Column3"] }).ToArray();

var dtData = dt.AsEnumerable().Select(x => new[] { x.Field<string>("Column1"), x.Field<int>("Column2").ToString(), x.Field<string>("Column3") }).ToArray();

如何在我的扩展方法中使用param object[] columns值?

1 个答案:

答案 0 :(得分:3)

您可以对columns参数执行选择。我在这里将对象[]的类型更改为字符串[]。

public static class ExtensionMethods
{
    public static object ToStringArray(this DataTable dt, params string[] columns)
    {
        //if specifically columns are provided then returns item array values for these columns.
        if (columns != null && columns.Length > 0)
        {
            return dt.AsEnumerable().Select(x => columns.Select(c => x[c]).ToArray()).ToArray();
        }
        else
        {
            return dt.AsEnumerable().Select(x => new[] { x.ItemArray }).ToArray();
        }
    }
}