C# 将数据行中的字符串转换为双精度

C# 将数据行中的字符串转换为双精度,c#,asp.net,datatable,datarow,C#,Asp.net,Datatable,Datarow,我正在从web读取csv文件并将其转换为数据表。第一列是一个字符串。第二、第三和第四列是数字。我想把第二、第三和第四列转换成双精度。我在下面编写了执行此任务的方法。但是,当我执行转换“Convert.ToDouble”并将其存储回数据行时,它似乎将其保留为字符串对象 public static DataTable ConvertCSVtoDataTable(string strFilePath) { HttpWebRequest req = (HttpWebRequest)WebRequ

我正在从web读取csv文件并将其转换为数据表。第一列是一个字符串。第二、第三和第四列是数字。我想把第二、第三和第四列转换成双精度。我在下面编写了执行此任务的方法。但是,当我执行转换“Convert.ToDouble”并将其存储回数据行时,它似乎将其保留为字符串对象

public static DataTable ConvertCSVtoDataTable(string strFilePath)
{
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strFilePath);
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

    StreamReader sr = new StreamReader(resp.GetResponseStream());
    string[] headers = sr.ReadLine().Split(',');
    DataTable dt = new DataTable();
    foreach (string header in headers)
    {
        dt.Columns.Add(header);
    }
    while (!sr.EndOfStream)
    {
        string[] rows = sr.ReadLine().Split(',');
        DataRow dr = dt.NewRow();
        for (int i = 0; i < headers.Length; i++)
        {                
            switch (i)
            {
                //Convert columns 1,2, and 3 to double
                case 1:
                    dr[i] = Convert.ToDouble(rows[i]); 

                    break;
                case 2:
                    dr[i] = Convert.ToDouble(rows[i]);
                    break;
                case 3:
                    dr[i] = Convert.ToDouble(rows[i]);
                    break;
                default:
                    dr[i] = rows[i];
                    break;
            }                              
        }
        dt.Rows.Add(dr);
    }

    return dt;
}
公共静态数据表ConvertCSVtoDataTable(字符串strFilePath)
{
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(strFilePath);
HttpWebResponse resp=(HttpWebResponse)req.GetResponse();
StreamReader sr=新的StreamReader(resp.GetResponseStream());
string[]headers=sr.ReadLine().Split(',');
DataTable dt=新的DataTable();
foreach(标头中的字符串标头)
{
dt.Columns.Add(表头);
}
而(!sr.EndOfStream)
{
string[]rows=sr.ReadLine().Split(',');
DataRow dr=dt.NewRow();
for(int i=0;i
添加列时需要指定列类型。将创建列的代码更改为类似以下内容(基于您希望的列类型
double
):

此代码将创建前三列的类型为
double
,其余列的类型为
string

引述此文:

默认情况下,新列的数据类型为string


如果不指定类型,则会得到一列,默认类型为
string

Replace
foreach
循环到

for (int i = 0; i < headers.Length; i++)
{
    if (i >= 1 && i <= 3)
        dt.Columns.Add(headers[i], typeof(double));
    else
        dt.Columns.Add(headers[i]);
}
for(int i=0;i=1&&i而不是:

foreach (string header in headers)
{
    dt.Columns.Add(header);
}
使用

for(int i=0;i
这里有一些很棒的答案。谢谢。
foreach (string header in headers)
{
    dt.Columns.Add(header);
}
for (int i = 0; i < headers.Count(); i++ )
{
    switch (i)
    {
        case 1: case 2: case 3:
            dt.Columns.Add(headers[i], typeof(double));
            break;
        default:
            dt.Columns.Add(headers[i], typeof(string));
            break;
    }
}