使用循环将数据从csv文件添加到List

时间:2015-06-17 17:40:47

标签: c# list csv

我是新手,这是我的第一个问题,请原谅我的解释中的任何误解。

我正在尝试将数据从csv文件导入到我定义的对象列表中。 我的文件有2列5行:1表示日期,1表示当天销售的产品数量。 我的应用程序读取文件,将数据存储在2个列表中(1表示日期listDate,1表示销售量列表卷),然后将这两个数据合并到一个新对象mySale中,并将该对象添加到最终列表Car中。 只要我逐行将mySale添加到Car(下面的代码中的OPTION 1),但是当尝试使用循环(for语句)时,我总是最终将我的最终列表填充到最后一行文件(下面代码中的选项2)。 在调试期间,我可以在mySale中查看属性日期正确,然后将其添加到Car中,但是一旦循环结束,结果似乎已更改:-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; }
    }
}

1 个答案:

答案 0 :(得分:2)

mySales是一个类,它是一个引用类型。在选项2中,您正在执行以下操作:

  1. 您创建mySale,现在是对mySales的特定实例的引用。
  2. for循环中,您修改mySale(仍然是对该完全相同的实例的引用),然后将此相同的实例添加到列表的末尾。
  3. 最后,当您多次添加mySale时,您会有一个列表,其中包含对同一实例的多个引用。

    您可能想要做的是定义并实例化mySale循环内的for ,而不是外部。