从 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()>();
但这不会编译。
所以我的问题是:
- 是否可以使用泛型执行我正在尝试的操作?
- 是否有替代/预先存在的扩展方法来实现这一目标?
- 你会怎么做?
可以使用 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?>
的值类型添加方法重载。