将DataTable转换为List<在R.NET
本文关键字:NET List DataTable 转换 | 更新日期: 2023-09-27 18:08:15
我试图使用后端R和前端c#使用r。net连接器做一个项目。我想把一个DataTable转换成一个List,然后再转换成NumericMatrix,因为R不能处理DataTable。
但是当到达以下行时:
double r = Convert.ToDouble(row);
我得到这个错误:
输入字符串格式不正确。
这是我的代码:
NumericMatrix matadata;
int nkolom = dataawal.Columns.Count;
if (nkolom > 1)
{
for (int j = 1; j < nkolom; j++)
{
int kol = dataawal.Columns[j].Ordinal;
List<double> s = new List<double>();
for (int i = 0; i < dataawal.Rows.Count; i++)
{
String row = dataawal.Rows[i].ItemArray[kol].ToString();
if (String.IsNullOrEmpty(row))
{
break;
}
else
{
double r = Convert.ToDouble(row); // NOTE Error comes here!
s.Add(r);
}
}
String nokol = Convert.ToString(j + 1);
NumericVector v = engine.CreateNumericVector(s);
engine.SetSymbol("dum", v);
matadata = engine.Evaluate("matdt=matrix(cbind(matdt,dum),ncol=" + nokol + ")").AsNumericMatrix();
}
}
通常,当您不确定表示双精度值的字符串值的正确性时,您应该求助于double. tryparse。如果字符串不能被识别为有效的双精度类型,此方法不会抛出异常,而是返回false,并且您可以跳过(或假设为零)违规行。
像这样
...
else
{
double r;
// if tryparse returns true then r has received the converted value
if(double.TryParse(row, out r))
s.Add(r);
}
...
但是,您可能会遇到其他问题,例如值是有效的双精度值,但用当前区域设置无效的十进制格式表示。在这种情况下,您需要另一种形式的double.TryParse。它也接受实现IFormatProvider
接口的类的实例。
例如,假设您希望使用it-IT
区域设置格式化双精度值(其中逗号将整数部分与小数分隔开),那么您应该使用
CultureInfo ci = new CultureInfo("it-IT");
...
else
{
double r;
if(double.TryParse(row, NumberStyles.AllowDecimalPoint, ci, out r))
s.Add(r);
}
...