我需要阅读此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])
});
}
}
}
}
答案 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。
发现的另一个问题是,您的列表声明中最初没有静态修饰符。没有它,你需要一个类的实例(即不是静态的)。要使此类可实现,您需要从类,其所有字段,属性和方法中删除静态修改器。
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}}