6

我有一种方法可以确定 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));
}

我想将其重构为:

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;
    }
4

3 回答 3

6

简单地将其创建为泛型应该可以:

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);
于 2011-09-12T16:13:50.093 回答
2

如果你想在运行时这样做,你不能使用泛型。您可以像这样重写您的方法:

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。

于 2011-09-12T16:31:57.647 回答
1

你不能这么简单。column.DataType 将是 SqlDbType 并且因为 它只会在运行时知道,所以编译器无法验证它是IComparable.

于 2011-09-12T16:15:52.303 回答