嘿所以我首先要说的是这是一项任务......我必须创建一个基于控制台的购物车,它可以加载并保存到XML文件中。
我无法弄清楚如何将XML文件加载到对象中/这是最好的方法....
class Product
{
public int RecordNumber { get; set; }
public String Name { get; set; }
public int Stock { get; set; }
public int Price { get; set; }
}
class Cart
{
public List<Product> items
{
get { return items; }
set { items = value; }
}
public Cart() {} //Right way to do constructor?
public void AddProduct(Product prod)
{
items.Add(prod);
}
public void RemoveProduct(Product prod)
{
items.Remove(prod);
}
}
static void Main(string[] args)
{
XDocument XDoc = XDocument.Load("inventory.xml"); // Loading XML file
var result = from q in XDoc.Descendants("product")
select new Product
{
RecordNumber = Convert.ToInt32(q.Element("recordNumber").Value),
Name = q.Element("name").Value,
Stock = Convert.ToInt32(q.Element("stock").Value),
Price = Convert.ToInt32(q.Element("price").Value)
};
XML文件设置如下(产品的十个条目):
<product>
<recordNumber>1</recordNumber>
<name>Floo Powder</name>
<stock>100</stock>
<price>5</price>
</product>
我这里有两个问题......我的主要方法是加载XML文件并创建10个对象吗?如果是这样,我该如何访问这些对象?
其次,我打算将产品添加到购物车中,然后减少“库存”数字,但是当我想到它似乎是错误的时候。我应该为每个可用库存创建一个对象,然后将它们添加到购物车吗?关于我如何能够做到这一点的任何建议呢?
非常感谢!!
编辑:
我将不得不按照自己的意愿给用户添加/删除库存。我想在完成所有10个对象(记录号,名称,库存,价格)的详细信息之后,执行该操作的代码将会是这样的。
String input = Console.ReadLine();
foreach (var prod in result) {
if (input == prod.recordnumber) { // Assuming that user selects via indexnumber
cart.AddProduct(//no idea what to put from here on
}
}
我是在正确的轨道上吗?
第二次编辑:
String productNumber = Console.ReadLine();
int productInt = Convert.ToInt32(productNumber);
var match = from p in result
where p.RecordNumber == productInt
select p;
if (match != null)
{
ShoppingCart.AddProduct(??); //what variable do I put in the parentheses?
// Need to also reduce stock
}
else
{
// Inform user that no product exists
}
正如我在下面所说,我完全不知道括号中的内容。我试过匹配和p但显然他们不对。一旦我知道如何引用对象,我也应该能够减少对象的库存号,并将另一个实例放入列表中。
再次感谢您帮助我
答案 0 :(得分:1)
您的程序正在结果变量中加载10个产品项目,并退出。要将它们放入购物车,您需要构建一个Cart对象,并将每个产品项添加到购物车:
static void Main(string[] args)
{
XDocument XDoc = XDocument.Load("inventory.xml"); // Loading XML file
var result = from q in XDoc.Descendants("product")
select new Product
{
RecordNumber = Convert.ToInt32(q.Element("recordNumber").Value),
Name = q.Element("name").Value,
Stock = Convert.ToInt32(q.Element("stock").Value),
Price = Convert.ToInt32(q.Element("price").Value)
};
var cart = new Cart();
// Logic to add/remove/list cart here
}
要允许用户在购物车中添加/删除商品,您需要具有标识符,无论是添加/删除/列表,还是哪个项目。这必须是一个循环。您可能也会有退出条件。所以有以下几点:
var cmd = string.Empty;
do
{
// Loop to allow the user to keep entering commands
cmd = Console.ReadLine();
// if cmd == exit condition -> break;
// if cmd == list products condition -> write each prod to console
// if cmd == add product condition -> Ask user to enter product number and add to cart
// if cmd == remove product condition -> Ask user to enter product number and remove from cart
} while(true);
当用户输入产品编号时,您可以使用linq找到正确的产品:
var match = (from p in result
where p.RecordNumber == productNumber
select p).FirstOrDefault();
if (match != null)
{
// Add/remove
}
else
{
// Inform user that no product exists
}
答案 1 :(得分:0)
您可以使用XmlSerializer
:
var xmlSerializer = new XmlSerializer(typeof(List<Product>));
List<Product> productList;
using (var fileStreamReader = File.OpenRead("inventory.xml"));
{
productList = (List<Product>) xmlSerializer.Deserialize(fileStreamReader);
}
使用LINQ 2 XML是可以的,但如果您只想将XML反序列化为对象表示,则序列化更容易。