O.O*_*O.O 6 c# generics linq-to-dataset
我有一个方法,确定一个列的最小和最大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));
}
Run Code Online (Sandbox Code Playgroud)
我想重构这个:
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));
}
Run Code Online (Sandbox Code Playgroud)
我需要确定数据类型并使用它而不是硬编码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;
}
Run Code Online (Sandbox Code Playgroud)
简单地将其创建为通用应该有效:
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));
}
Run Code Online (Sandbox Code Playgroud)
然后你将用作:
GetMinMaxRange<MyType>(dataTable, valueColumnName);
Run Code Online (Sandbox Code Playgroud)