我的项目文件夹中有一个文件,其中包含Vehicle类中属性的数据。如果该类被硬编码到XAML中,它将如下所示:
Vehicle v1 = new Car() { Make = "Ford", Model = "Fiesta", Price = 10000, Year = "1999", Colour = "Red", Mileage = 40000, Description = "Lovely red car, 4 wheel, optional steering wheel.", VehicleType = "Car" };
VehicleList.Add(v1);
我不想对这个类对象进行硬编码,而是希望从.txt文件中读取它,每个部分用逗号分隔,''并将它们放入每个属性中并将该车辆添加到车辆列表中<> ' VehicleList'然后将此新读取列表显示在列表框中。
硬编码和.txt都遵循相同的结构,包含变量名的硬编码和仅包含数据的.txt文件。
这是我到目前为止所看到的,因为你可以看到我尝试使用System.IO但是我对其他方法持开放态度。
private void Button_Click(object sender, RoutedEventArgs e)
{
string location = @"PATH";
VehicleList = File.ReadAllLines(location).ToList();
var logFile = File.ReadAllLines(location);
foreach (var v[i] in logFile) VehicleList.Add(s);
}
}
答案 0 :(得分:0)
public static List<Car> FromTextFile(string fileName)
{
var lines = File.ReadAllLines(fileName);
var cars = new List<Car>();
foreach (var line in lines)
{
var car = FromLine(line);
if (car == null)
continue;
cars.Add(car);
}
return cars;
}
private static Car FromLine(string line)
{
var values = line.Split(',');
if (values.Length != 8) // There is no specification on what to do, if the amount of items is not sufficient.
return null;
// There is also no specification on what order to use, or how to map the ordering.
return new Car
{
Make = values[0],
Model = values[1],
// There is also no specification on how to handle in-correct formats.
// This assumes the Price property to be type of int.
Price = int.Parse(values[2]),
Year = values[3],
Colour = values[4],
// Again; how to handle in-correct formats?
Mileage = int.Parse(values[5]),
Description = values[6],
VehicleType = values[7]
};
}
此代码应该按照您的描述进行操作。请注意此代码的限制;
请记住,这不是一个理想的代码,但编写得不好。
现在,关于你的代码;
首先,您为线条提供了两个不同的值。我不知道为什么。其中一个应该没问题。
其次,您尝试使用foreach
遍历其中一个,但它并没有像这样工作。您不能从foreach
循环中提供或获取索引。正确的是foreach (TYPE VARIABLE_NAME in COLLECTION)
。所以你的代码是foreach (var v /* not v[i] */ in logFile) // ..
。
然后将其添加到再次包含这些分隔行的列表中。在一天结束时,您有一个包含相同行两次的列表。你应该在添加部分中做的是,你应该将线转换为Car对象。现在你如何做到这一点,绝对取决于你。这个问题在我脑海中浮现,当任务是将字符串集合映射到对象时。
现在,这不是一个非常常见的问题。每个人都需要以某种方式将数据从位置A传输到位置B.对于您的特定实例,它是从磁盘存储到内存,以对象的形式。
人们如何解决这些问题?他们发明了通用的方法&#34;序列化&#34;和#34;反序列化&#34;。有什么例子?我所想到的最知名的和最常用的是XML(可扩展标记语言)和JSON(JavaScript Object Notation)。这些实际上做了什么?它们将编程对象序列化为非二进制字符串格式。以下是Car类的XML输出示例。
<?xml version=\"1.0\" encoding=\"utf-16\"?>
<Car xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
<Make>Ford</Make>
<Model>Fiesta</Model>
<Price>10000</Price>
<Year>1999</Year>
<Colour>Red</Colour>
<Mileage>40000</Mileage>
<Description>Lovely red car, 4 wheel, optional steering wheel.</Description>
<VehicleType>Car</VehicleType>
</Car>
使用这个简单的代码生成;
var car = new Car
{
Make = "Ford",
Model = "Fiesta",
Price = 10000,
Year = "1999",
Colour = "Red",
Mileage = 40000,
Description = "Lovely red car, 4 wheel, optional steering wheel.",
VehicleType = "Car"
};
var serializer = new XmlSerializer(typeof(Car));
// https://stackoverflow.com/questions/2434534/serialize-an-object-to-string
using (StringWriter textWriter = new StringWriter())
{
serializer.Serialize(textWriter, car);
var output = textWriter.ToString();
}
这就是,如果文本格式正确,您将如何从文本文件中轻松阅读&#34; Car&#34;
var serializer = new XmlSerializer(typeof(List<Car>));
// If your file should contain one car and one car only, you should change the above line to;
// var serilizer = new XmlSerializer(typeof(Car));
using (var reader = File.OpenRead(@"PATH"))
{
var cars = (List<Car>)serializer.Deserialize(reader);
reader.Close();
}
可以为JSON编写类似的代码。但我认为你明白了。
简而言之,大多数情况下,XML,JSON或类似的通用格式就足够了。如果不是,您可以开发自己的格式。但是逗号分隔的行是一种非常简单的序列化方式。原因正是我的问题(见上文)。而XML,JSON很容易回答这些问题。在大多数情况下,实现也做得很好。
这是一个非常相似的问题的答案。这个问题的答案很可能也会回答你的问题。 How to split csv whose columns may contain ,