0

私は多くのアドバイスを受けて、構造体を使用する代わりに、クラスを使用してリストを作成しています

コードの断片

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 に答える