在R.NET中将DataTable转换为List <double>

时间:2015-08-15 08:10:14

标签: c# r

我尝试使用后端R和使用R.NET连接器前端C#创建项目。 我想将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();
    }
}

1 个答案:

答案 0 :(得分:0)

通常,当您不确定表示double值的字符串值的正确性时,您应该求助于double.TryParse。如果字符串无法被识别为有效的double,则此方法不会抛出异常,而是返回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,但表示的十进制格式对您当前的区域设置无效。在这种情况下,您需要一个不同形式的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);
}
...