How to use <T> field with type?
I have a method that defines the min and max of a column in a 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)); } I want to reorganize this as:
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)); } I need to determine the data type and use it instead of hard coding m.Field<double> . How to do it?
UPDATE Regarding why I want to calculate the difference between min and max
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; } +6
3 answers
A simple creation of this as a general should work:
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)); } which you would then use as:
GetMinMaxRange<MyType>(dataTable, valueColumnName); +6
If you want this at run time, you cannot use generics. You can rewrite your method as follows:
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)); } I checked this in a list, for example:
List<string> num = new List<string>() { "1", "2", "3", "-1", "11", "10", "100" }; var min = num.AsEnumerable().Min(m => Convert.ChangeType(m, typeof(int))); and gives the correct result: -1.
+2