DataTableのDataColumnが数値(SQL Serverデータベースから取得)であるかどうかを確認するためのこれよりも優れた方法はありますか?
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand("Get_Some_Data");
DataSet ds = db.ExecuteDataSet(cmd);
foreach (DataTable tbl in ds.Tables) {
foreach (DataColumn col in tbl.Columns) {
if (col.DataType == typeof(System.Single)
|| col.DataType == typeof(System.Double)
|| col.DataType == typeof(System.Decimal)
|| col.DataType == typeof(System.Byte)
|| col.DataType == typeof(System.Int16)
|| col.DataType == typeof(System.Int32)
|| col.DataType == typeof(System.Int64)) {
// this column is numeric
} else {
// this column is not numeric
}
}
}
実際の型と比較する以外に、型が数値であるかどうかを確認する良い方法はありません。
これは、数値の定義が少し異なる場合に特に当てはまります(あなたの場合、コードによれば、-符号なし整数は数値ではありません)。
もう1つは、 MSDNによるDataColumn.DataType は次のタイプのみをサポートするということです。
太字タイプは(私が定義したように)数値であるため、必ずチェックする必要があります。
私は個人的にDataColumn型の拡張メソッドを作成します(TYPEではありません!)。
私はif ... then..elseのものが嫌いなので、代わりに[〜#〜] sets [〜#〜]ベースのアプローチを使用します、 このような:
public static bool IsNumeric(this DataColumn col) {
if (col == null)
return false;
// Make this const
var numericTypes = new [] { typeof(Byte), typeof(Decimal), typeof(Double),
typeof(Int16), typeof(Int32), typeof(Int64), typeof(SByte),
typeof(Single), typeof(UInt16), typeof(UInt32), typeof(UInt64)};
return numericTypes.Contains(col.DataType);
}
そして、使用法は次のようになります。
if (col.IsNumeric()) ....
これは私にとって十分に簡単です
1行のコードだけで、配列を使用しない別の方法:
return col != null && "Byte,Decimal,Double,Int16,Int32,Int64,SByte,Single,UInt16,UInt32,UInt64,".Contains(col.DataType.Name + ",");
このコード行は、通常のヘルパーメソッドまたは拡張メソッドとして使用できます。
たぶんあなたはそれを短くすることができます:
System.Type theType = col.DataType AS System.Type
if(theType == System.Single || theType == System.Double...) {}