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
source share
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
source

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
source

You cannot do it that simple. column.DataType will be SqlDbType and since it will only be known at runtime, so the compiler cannot verify that it is IComparable .

+1
source

Source: https://habr.com/ru/post/897162/


All Articles