6

の列の最小値と最大値を決定するメソッドがあります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>。これを行う方法?

UPDATE最小値と最大値の差を計算したい 理由について

    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 に答える