【问题标题】:Issue with adding a Double to a List<double>将 Double 添加到 List<double> 的问题
【发布时间】:2013-05-21 18:40:33
【问题描述】:

我在将 DoubleCSV 文件添加到 List&lt;double&gt; 时遇到问题。现在我以前用完全相同的文件做过这个,并将它添加到Double Array。 这是我的代码,适用于array

double[] ch1Array = new double[arraySize];

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{               
   string fileName = Path.Combine(filePath, openFileDialog1.FileName);                
   var reader = new StreamReader(File.OpenRead(fileName));

   while(!reader.EndOfStream)
   {
      var line = reader.ReadLine(); //Get through the column titles
      var values = line.Split(',');
      if (dataSize > 0)
      {
         try
         {
             ch1Array[dataSize] = Convert.ToDouble(values[1]);
             //etc...

这段代码完美运行,我唯一改变的是我不再使用Array,而是使用List&lt;double&gt;

            List<double> ch1Array = new List<double>();

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //Create stream reader and open file
                string fileName = Path.Combine(mainFilePath, openFileDialog1.FileName);
                var reader = new StreamReader(File.OpenRead(fileName));

                int counter = 0;

                //Read document until end of stream
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine(); 
                    var values = line.Split(',');

                    try
                    {   
                        ch1Array.Add(Convert.ToDouble(values[1]));
                        //etc..

现在我假设我使用了List 错误(这是我第一次使用Lists)。一旦程序到达该部分(它编译并运行良好),它就会告诉我我有一个错误并且我的输入字符串的格式不正确。但是因为我可以在其他情况下使用变量values[1] 作为Double,所以我不知道我在做什么,这会引发错误。 谁能告诉我我做错了什么?

编辑:这是抛出的异常:

【问题讨论】:

  • 堆栈跟踪是什么?
  • 异常发生时 values[1] 发生了什么?
  • 这不是您的列表错误。这是“Convert.ToDouble(values[1])”中的错误。但是我们需要更多信息才能进一步帮助您... values[1] 的价值是什么?真正的错误信息是什么?
  • List&lt;&gt; 代码看起来不错,所以它是别的东西。使用调试器来验证发生了什么。即使您确定它是相同的,它也可能是不同的文件。
  • 我什至认为您不会在数组示例中添加新元素,除非您在其他地方增加 dataSize 并增加数组大小。

标签: c# list csv double


【解决方案1】:

问题在于您没有正确解析 CSV 文件。它看起来像这样:

"Some value","3276",Something

当您在, 上拆分时,您最终会得到values[1]"3276"(其中包含双引号的字符串,而不仅仅是3276),它不能被解析为数字。我建议您使用现有的 CSV 库,例如FileHelpers 或谷歌搜索其他内容。

, 上拆分的另一个问题是值是否包含逗号,例如:

"Some, value","3276",Something

将分为"Somevalue""3276"Something。然后你会尝试解析value",这显然是行不通的。出于这个原因,我不建议您只使用Replace 来删除您号码中的引号。

【讨论】:

  • 我希望我能将你们两个都标记为正确。感谢您的帮助:)
【解决方案2】:

您说您的消息框显示的值为“3276”。这意味着您正在尝试执行Convert.ToDouble("\"3276\""),这将引发您遇到的异常。

更改以下行:

Convert.ToDouble(values[1])

收件人:

Convert.ToDouble(values[1].Replace("\"",""));

【讨论】:

  • 完美。我刚刚输入了这段代码,瞧它工作了:)。谢谢!
  • @tmwoods - 很好,但这个答案与您提出的问题几乎没有关系。
  • @HenkHolterman:我绝对觉得它回答了这个问题。如果你关注评论对话,我会在他们被问到时列出额外的细节,而这个答案正是我情况的核心。回答者给了我准确的代码,它起作用了,所以他获得了正确的答案标记。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多