0

我想为 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. 你会怎么做?
4

2 回答 2

3

您可以使用 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();
}

注意:ArgumentNullExceptionrows参数为空时我会抛出。也考虑使用IEnumerable<DataRow>而不是数组。

于 2014-08-15T15:42:43.460 回答
2

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

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)例如 is 0,因此您可能希望指定用于 null 值的参数作为参数,或者为返回 a 的值类型添加方法的重载List<T?>

于 2014-08-15T15:41:42.090 回答