从 DataRow[] 中提取列的扩展,作为具有相同数据类型的列表、数组等

本文关键字:数据类型 数组 列表 DataRow 提取 扩展 | 更新日期: 2023-09-27 18:18:05

我想为 System.Data.DataRow[] 创建一个扩展方法,该方法将从 DataRow[] 中获取单个列并将其转换为列数据类型的列表、数组等。

最初,我将其作为字符串扩展,可以生成字符串数组,但想为不同的数据类型探索更通用的解决方案。

字符串解决方案如下。.

 public static string[] ExtractColumn(this DataRow[] DataRows, string Column)
    {
        if (DataRows.Count() == 0) { return null; }
        string[] returnString = new string[DataRows.Count()];
        int i = 0;
        foreach (DataRow r in DataRows ?? new DataRow[0])
        {
            returnString[i] = r[Column].ToString();
            i++;
        }
        return returnString;
    }

当我开始研究一种更通用的方法时,我陷入了构建 T 列表的困境,其中 T 是 DataColumn 的类型。

    public static List<T> ColumnToArray<T>(this DataRow[] DataRows, string Column)
    {
        List<T> list = new List<T>();
        if (DataRows.Count() == 0) { return null; }
        foreach (DataRow r in DataRows ?? new DataRow[0])
        {
            list.Add(r[Column]); //<-- Does not compile
        }
        return list;
    }

我试图像这样制作一个本地列表: List<DataRows[0][Column].GetType()> list = new List<DataRows[0][Column].GetType()>();但这不会编译。

所以我的问题是:

  1. 是否可以使用泛型执行我正在尝试的操作?
  2. 是否有替代/预先存在的扩展方法来实现这一目标?
  3. 你会怎么做?

从 DataRow[] 中提取列的扩展,作为具有相同数据类型的列表、数组等

可以使用 LINQ to DataSet 行Field<T>扩展名,并将代码简化为

public static List<T> ColumnToArray<T>(this DataRow[] rows, string columnName)
{
    // check if rows not null
    return rows.Select(r => r.Field<T>(columnName)).ToList();
}

注意:当rows参数为空时,我会抛出ArgumentNullException。还可以考虑使用 IEnumerable<DataRow> 而不是数组。

您需要将值强制转换为列表的类型:

list.Add((T)r[Column]);

或者使用Field扩展方法:

list.Add(r.Field<T>(Column));

您可能还希望处理空值,例如:

list.Add(r.IsNull(Column) ? default(T) : r.Field<T>(Column));

注意:例如,default(int)0 ,因此您可能希望指定将空值用作参数的内容,或者为返回 List<T?> 的值类型添加方法重载。