データテーブルで列の中央値を見つけたいのですSystem.InvalidCastException
が、コンソールアプリケーションでエラーが発生します。これを整理する方法はありますか?データ表
DataTableには、(ggg、htt、yy)のような文字列値、または%、$、#、@、!、*、&のような特殊文字、またはignoneである必要があるNullまたは空の文字列を含めることもできます。
Program p = new Program();
double med=p.GetMedianFromDataTable(csvData, "Data Value");
public double GetMedianFromDataTable(DataTable dt, string columnName)
{
//extract data from datacolumn and build and a double array
double[] values =
Array.ConvertAll<DataRow, double>(
dt.Select(),
delegate (DataRow row) { return (double)row[columnName]; } //getting error here
);
return GetMedianFromArray(values);
}
public double GetMedianFromArray(double[] values)
{
double median;
//sort the array
Array.Sort(values);
if (values.Length % 2 != 0)
{
median = values[values.Length / 2];
}
else
{
int middle = values.Length / 2;
double first = values[middle];
double second = values[middle - 1];
median = (first + second) / 2;
}
return median;
}
例外は、すべての値がdoubleであるとは限らないことを示しています。質問では明確になっていないので、データテーブルの値は文字列だと思います。このlinqステートメントは、doubleである値を選択し、それらを変換します。これはtryparseの変数のインライン宣言を使用することに注意してください。これは、古いC#コンパイラでは機能しません)
double[] values = dt.Rows.OfType<DataRow>()
.Select(dr=>dr[columnName].ToString())
.Where(v=>double.TryParse(v, out double ignore))
.Select(v=>double.Parse(v))
.ToArray();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加