从CSV文件读取到对象列表

时间:2017-05-09 20:12:16

标签: c#

我需要阅读此CSV文件并将其转换为List<Vehicle>个对象(汽车和自行车),必须忽略第一行,第三行是对象类型:

Name price typeOfVehicle Horsepower NumberOfPedals
Audi,100000,Car,500,
BMW,20000,Car,300
Abici,1000,Bicycle,,2
Atala,2000,Bicycle,,2

到目前为止我的代码:

abstract class Vehicle
    {
        public string Name { get; set; }
        public int Price { get; set; }
    }

    class Car : Vehicle
    {
        public int Horsepower { get; set; }
    }

    class Bicycle : Vehicle
    {
        public int NumberOfPedals { get; set; }
    }

    static class Offers
    {
        public  List<Vehicle> itemlist = new List<Vehicle>();
        public static void readfromfile()
        {
            var lines = System.IO.File.ReadAllLines("C:\\Offers.csv");

            foreach (string item in lines)
            {
                var values = item.Split(',');
                //need to check which type of vehicle is it
                if (values[2] == "Car")
                {
                    itemlist.Add(new Car()
                    {
                        Name = values[0],
                        Price = int.Parse(values[1]),
                        Horsepower = int.Parse(values[3])
                    });
                }
                else if (values[2] == "Bicycle")
                {
                    itemlist.Add(new Bicycle()
                    {
                        Name = values[0],
                        Price = int.Parse(values[1]),
                        NumberOfPedals = int.Parse(values[3])
                    });
                }

            }
        }
    }

我想从CSV文件中读取,在阅读时,如果第3个值是汽车或自行车,我需要检查每一行。如果它是一辆汽车,那么我制作汽车对象(并将所有值都给予属性)并将其放入车辆列表中,并将其放入自行车列表中。

我收到itemlist的错误:

  

非静态字段'Offers.itemlist

需要对象引用

最终解决方案:

abstract class Vehicle
    {
        public string Name { get; set; }
        public int Price { get; set; }
    }

    class Car : Vehicle
    {
        public int Horsepower { get; set; }
    }

    class Bicycle : Vehicle
    {
        public int NumberOfPedals { get; set; }
    }

    static class Offers
    {
        public static List<Vehicle> itemlist = new List<Vehicle>();
        public static void readfromfile()
        {
            var lines = System.IO.File.ReadAllLines("C:\\Offers.csv").Skip(1).TakeWhile(t => t != null);

            foreach (string item in lines)
            {
                var values = item.Split(',');
                //need to check which type of vehicle is it
                if (values[2] == "Car")
                {
                    itemlist.Add(new Car()
                    {
                        Name = values[0],
                        Price = int.Parse(values[1]),
                        Horsepower = int.Parse(values[3])
                    });
                }
                else if (values[2] == "Bicycle")
                {
                    itemlist.Add(new Bicycle()
                    {
                        Name = values[0],
                        Price = int.Parse(values[1]),
                        NumberOfPedals = int.Parse(values[3])
                    });
                }

            }
        }
    }

3 个答案:

答案 0 :(得分:2)

您当前的代码会创建一个新的Bike / Car对象,但从不使用它。相反,你一直在调用:new item(),它不是你程序中的有效类型/类。在将Bike / Car对象添加到Vehicle对象列表之前填充每个对象属性。

Vehicle car = new Car();
car.Name = values[0];
car.Price = int.Parse(values[1]);
car.Horsepower = int.Parse(values[3]);
itemlist.Add(car);

答案 1 :(得分:2)

你做错了一件事就是你要添加类型&#34; item&#34;到itemlist而不是你在上面的行上声明的汽车或bycycle。

发现的另一个问题是,您的列表声明中最初没有静态修饰符。没有它,你需要一个类的实例(即不是静态的)。要使此类可实现,您需要从类,其所有字段,属性和方法中删除静态修改器。

https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

static class Offers
{
    public static List<Vehicle> itemlist = new List<Vehicle>();
    public static void readfromfile()
    {
        var lines = System.IO.File.ReadAllLines("C:\\Offers.csv");

        foreach (string item in lines)
        {
            var values = item.Split(',');
            //need to check which type of vehicle is it
            if(values[2] == "Car")
            {
                itemlist.Add(new Car()
                {
                    Name = values[0],
                    Price = int.Parse(values[1]),
                    Horsepower = int.Parse(values[3])
                });
            }
            else if (values[2]=="Bicycle")
            {
                itemlist.Add(new Bicycle()
                {
                    Name = values[0],
                    Price = int.Parse(values[1]),
                    NumberOfPedals= int.Parse(values[3])
                });
            }

        }
    }
}

答案 2 :(得分:1)

您的第一个问题是将您的课程readfromfile()和您的方法static标记为static。如果您没有具体原因,只需删除,修饰符,您的问题就会解决。

解决第二个问题有两个选项(索引越界):

1)将分隔符Name,price,typeOfVehicle,Horsepower,NumberOfPedals 添加到列标题行:

var lines = System.IO.File.ReadAllLines("C:\\Offers.csv").Skip(1);

2)在拆分行之前跳过列标题行:

{{1}}