如何使用Field与类型
本文关键字:类型 何使用 Field | 更新日期: 2023-09-27 18:08:16
我有一个方法来确定DataTable
中列的最小值和最大值:
public void GetMinMaxRange( DataTable data, string valueColumnName )
{
var min = data.AsEnumerable().Min(m => m.Field<double>(valueColumnName));
var max = data.AsEnumerable().Max(m => m.Field<double>(valueColumnName));
}
我想把它重构为:
public void GetMinMaxRange( DataTable data, string valueColumnName )
{
DataColumn column = data.Columns[valueColumnName];
var min = data.AsEnumerable().Min(m => m.Field<column.DataType>(valueColumnName));
var max = data.AsEnumerable().Max(m => m.Field<column.DataType>(valueColumnName));
}
我需要确定数据类型并使用它而不是硬编码m.Field<double>
。如何做到这一点?
至于为什么我想计算最小值和最大值之间的差
public static double/decimal/int GetMinMaxRange<T>(DataTable data,
string valueColumnName) where T : IComparable<T>
{
DataColumn column = data.Columns[valueColumnName];
var min = data.AsEnumerable().Min(m => m.Field<T>(valueColumnName));
var max = data.AsEnumerable().Max(m => m.Field<T>(valueColumnName)); ;
return max - min;
}
简单地将其创建为泛型应该可以工作:
public void GetMinMaxRange<T>( DataTable data, string valueColumnName )
where T : IComparable<T>
{
DataColumn column = data.Columns[valueColumnName];
var min = data.AsEnumerable().Min(m => m.Field<T>(valueColumnName));
var max = data.AsEnumerable().Max(m => m.Field<T>(valueColumnName));
}
你可以将其用作:
GetMinMaxRange<MyType>(dataTable, valueColumnName);
如果你想在运行时这样做,你不能使用泛型。你可以这样重写你的方法:
public void GetMinMaxRangeTest(DataTable data, string valueColumnName)
{
DataColumn column = data.Columns[valueColumnName];
var min = data.AsEnumerable().Min(m => Convert.ChangeType(m[valueColumnName], column.DataType));
var max = data.AsEnumerable().Max(m => Convert.ChangeType(m[valueColumnName], column.DataType));
}
我在一个列表上测试了这个,像这样:
List<string> num = new List<string>() {
"1", "2", "3", "-1", "11", "10", "100"
};
var min = num.AsEnumerable().Min(m => Convert.ChangeType(m, typeof(int)));
,它会产生正确的结果:-1。
你不能这么简单。column.DataType
将是一个SqlDbType,因为它只会在运行时被知道,所以编译器不能验证它是IComparable
。