2015-06-17 26 views
1

我是新開發人員,這是我的第一個問題,請原諒我解釋中的任何誤解。使用循環將csv文件中的數據添加到列表中

我想從csv文件中導入數據到我定義的對象列表中。 我的文件有2列和5行:1日期和1日銷售量。 我的應用程序讀取文件,將數據存儲在2個列表中(1表示日期listDate,1表示銷售量listVolume),然後將兩個數據組合到一個新對象mySale中,並將該對象添加到最終列表Car中。 只要將mySale逐行添加到Car(下面的代碼中的選項1),但試圖使用循環(for語句)時,它就可以正常工作,但最終我的最終列表將填入最後一行該文件(下面代碼中的選項2)。 調試過程中,我可以看到性能的約會體積是正確的mySale其添加到前車,但一旦循環結束,似乎結果已經改變:-s 我有以下代碼:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace dataManip 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 

      var reader = new StreamReader(File.OpenRead(@"C:\sales.csv")); 
      List<DateTime> listDate = new List<DateTime>(); 
      List<int> listVolume = new List<int>(); 
      List<mySales> Car = new List<mySales>(); 

      while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 

       listDate.Add(Convert.ToDateTime(values[0])); 
       listVolume.Add(Convert.ToInt32(values[1])); 
      } 

      mySales mySale = new mySales(); 

      //OPTION 1 
      mySale.date = listDate[3]; 
      mySale.volume = listVolume[3]; 

      Car.Add(mySale); 


      //OPTION 2 
      for (int i = 0; i < listDate.Count(); i++) 
      { 
       mySale.date = listDate[i]; 
       mySale.volume = listVolume[i]; 

       Car.Add(mySale); 
      } 

       foreach (int p in listVolume) 
       Console.WriteLine(p); 
       Console.WriteLine("\n"+Car[0].volume); 

       Console.ReadLine(); 
    } 

    } 

    class mySales 
    { 
     public DateTime date { get; set; } 
     public int volume { get; set; } 
    } 
} 

回答

2

mySales是一個類,它是一個引用類型。在選項2,你正在做以下幾點:

  1. 創建mySale,現在是到mySales特定實例的引用。
  2. for循環中,您修改了mySale(它仍然是對同一個實例的引用),然後將同一個實例添加到列表的末尾。

因此,最後,當您多次添加mySale時,您將擁有一個帶有對同一實例的多個引用的列表。

你可能想要做的是在for循環內定義和實例化mySale,而不是在外面。

+0

Awsome!當mySale在循環內聲明時,它工作得很好。也非常感謝詳細的解釋。 – Guil75

+0

@ Guil75這就是我在這裏:)。如果你喜歡我的回答,你會考慮將其標記爲正確嗎? – Jashaszun

相關問題