Как использовать поле <T>с типом? - PullRequest
6 голосов
/ 12 сентября 2011

У меня есть метод, который определяет минимальное и максимальное значения столбца в 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;
    }

Ответы [ 3 ]

6 голосов
/ 12 сентября 2011

Простое создание этого как универсального должно работать:

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);
2 голосов
/ 12 сентября 2011

Если вы хотите это во время выполнения, вы не можете использовать дженерики. Вы можете переписать свой метод так:

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.

1 голос
/ 12 сентября 2011

Вы не можете сделать это так просто.column.DataType будет SqlDbType, и, поскольку , он будет известен только во время выполнения, поэтому компилятор не может проверить, что это IComparable.

...