0

我接受了许多人的建议,而不是使用 Struct,而是使用类来创建一个列表

代码片段

class BigClass

class rawData
{
   public string recType;          
   public string ncmCode;  
}    

然后我使用 streamreader 将数据获取到对象中。

List<rawData> myData = new List<rawData>();
rawData tempRawData = new rawData();

while ((dataLine = readRawData.ReadLine()) != null)
{
  .....

  for (int i = 0; i < tokens.Length; i++)
  {
    // code to set fields of tempRawData stripped
    ....
  }
  myData.Add(tempRawData);
}

这个对象被添加到列表 myData 但发生的事情是当循环再次使用新的 tempRawData 运行时,它只是将它添加到 myData 并替换之前复制的内容。所以我得到 2 行相同的数据......它对 x 行执行此操作,所以如果它运行 10,000 次,则列表中的 10,000 行包含相同的数据,即在 csv 文件的第 10,000 行读取的数据。 ...

4

2 回答 2

3
List<rawData> myData = new List<rawData>();


while ((dataLine = readRawData.ReadLine()) != null)
{
  .....

  for (int i = 0; i < tokens.Length; i++)
  {

    rawData tempRawData = new rawData(); // <======
    // code to set fields of tempRawData stripped
    ....


    myData.Add(tempRawData);
  }
}

您的程序当前正在执行的操作是:

在此处输入图像描述

于 2013-07-20T21:46:28.017 回答
1

您需要RawData在每次迭代时创建新对象 - 您正在更新您拥有的唯一对象的字段(与 相比,这是相反的行为struct):

while ((dataLine = readRawData.ReadLine()) != null)
{
  RawData tempRawData = new rawData(); // new for each line iteration.

  ....
  for (int i = 0; i < tokens.Length; i++)
  {
     // set fields of tempRawData here
     ....
  }
  myData.Add(tempRawData);
}

注意:您也可以在每次迭代时保持RawData tempRawData外部while并在内部进行新操作,但它会扩展tempRawData可见范围,但没有任何好处。

于 2013-07-20T21:36:07.510 回答