将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();
    }
}

将DataTable转换为List<在R.NET

通常,当您不确定表示双精度值的字符串值的正确性时,您应该求助于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);
}
...