2

我有一个 XML 文件设置如下:

<products>
<product>
    <tradegood id = "11">Textiles</tradegood>
    <baseprice>3000</baseprice>
    <purchaseDMs>
        <mod type="A">-7</mod>
        <mod type="a">-5</mod>
        <mod type="i">-3</mod>
    </purchaseDMs>
    <resaleDMs>
        <mod type="A">-6</mod>
        <mod type="a">1</mod>
        <mod type="R">3</mod>
    </resaleDMs>
    <quantity>90</quantity>
</product>

我正在使用 LINQ to XML,如下所示:

  XDocument productList = XDocument.Load("products.xml");

  List<Product> products = 
                (from objProduct in productList.Element("products").Elements("product")
                    select new Product
                    {
                         Id = int.Parse(objProduct.Element("tradegood").Attribute("id").Value),
                         ProductName = objProduct.Element("tradegood").Value,
                         BasePrice = double.Parse(objProduct.Element("baseprice").Value),
                         MaxQuantity = int.Parse(objProduct.Element("quantity").Value),
                         PurchaseDMs = (from _mods in objProduct.Element("purchaseDMs").Elements("mod")
                              select new 
                                {
                                key = _mods.Attribute("type").Value,
                                value = _mods.Value
                                }),
                         ResaleDMs = (from _mods in objProduct.Element("resaleDMs").Elements("mod")
                              select new 
                                {
                                key = _mods.Attribute("type").Value,
                                value = _mods.Value
                                })
                      }).ToList;

以下是产品类别:

public class Product
{
    private string p_ProductName;
    private double p_BasePrice;
    private int p_MaxQuantity;
    private double p_ActualValue;
    private int p_id;
    private int p_Quantity;

    public string ProductName
    {
        get { return p_ProductName; }
        set { p_ProductName = value; }
    }
    public double BasePrice
    {
        get { return p_BasePrice; }
        set { p_BasePrice = value; }
    }
    public int MaxQuantity
    {
        get { return p_MaxQuantity; }
        set { p_MaxQuantity = value; }
    }
    public int QuantityAvailable 
    {
        get { return p_Quantity; }
        set { p_Quantity = value; }
    }
    public double ActualValue
    {
        get { return p_ActualValue; }
        set { p_ActualValue = value; }
    }
    public int Id
    {
        get { return p_id; }
        set { p_id = value; }
    }

    public Dictionary<string, int> ResaleDMs;
    public Dictionary<string, int> PurchaseDMs;
}

我不知道如何开始工作的唯一部分是 ResaleDMs 和 PurchaseDMs。

这些select语句都显示“无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.Dictionary'。存在显式转换(您是否缺少演员表?)”

谁能帮我解决这个问题?如何初始化这些字段?

4

2 回答 2

1

您收到该异常的原因是您正在为字典属性分配 IEnumerable 投影的值。

当你这样做时:

select new 
{
  key = _mods.Attribute("type").Value,
  value = _mods.Value
}

您只是在创建一个具有两个属性(键和值)的新匿名对象类型。这与字典条目对象类型没有直接关系。相反,您可以使用 ToDictionary 扩展方法..

PurchaseDMs = objProduct.Element("purchaseDMs").Elements("mod")
                        .ToDictionary(e => e.Attribute("type").Value, e => Convert.ToInt32(e.Value)),
ResaleDMs = objProduct.Element("resaleDMs").Elements("mod")
                      .ToDictionary(e => e.Attribute("type").Value, e => Convert.ToInt32(e.Value))
于 2013-02-23T06:16:37.823 回答
0

我认为您应该能够通过使用 ToArray() 来获取 IEnumerable:

List<Product> products = 
            (from objProduct in productList.Element("products").Elements("product")
                select new Product
                {
                     Id = int.Parse(objProduct.Element("tradegood").Attribute("ID").Value),
                     ProductName = objProduct.Element("tradegood").Value,
                     BasePrice = double.Parse(objProduct.Element("baseprice").Value),
                     MaxQuantity = int.Parse(objProduct.Element("quantity").Value),
                     PurchaseDMs = (from _mods in objProduct.Element("purchaseDMs").Elements("mod")
                          select new 
                            {
                            key = _mods.Attribute("type").Value,
                            value = _mods.Value
                            }),
                     ResaleDMs = (from _mods in objProduct.Element("resaleDMs").Elements("mod")
                          select new 
                            {
                            key = _mods.Attribute("type").Value,
                            value = _mods.Value
                            })
                  }).ToArray();
于 2013-02-23T06:15:14.467 回答