按键求和字典值

时间:2014-04-09 13:59:15

标签: c# linq dictionary

我有一个XML文档,我正在使用XDocument进行解析:

XDocument _document = XDocument.Parse(XMLString);

我正在阅读的XML(真实示例可能包含许多相同的ItemNumber):

<Line>
 <ITEMNMBR>18-4695</ITEMNMBR>
 <UNITCOST>2.00000</UNITCOST>
 <UNITPRCE>7.00000</UNITPRCE>
 <QUANTITY>15.00000</QUANTITY>
</Line>
<Line>
 <ITEMNMBR>18-4695</ITEMNMBR>
 <UNITCOST>3.00000</UNITCOST>
 <UNITPRCE>7.00000</UNITPRCE>
 <QUANTITY>22.00000</QUANTITY>
</Line>

然后我将这个xml读入一个词典:

var lines = _document.Descendants("Line")
                  .Select(l => l.Elements().ToDictionary(e => e.Name.LocalName, e => e.Value)).ToList();

接下来,获取不同ItemNumbers的列表:

 var itemNumbers = lines.Where(dict => dict.ContainsKey("ITEMNMBR"))
                    .Select(dict => dict["ITEMNMBR"])
                    .Distinct()
                    .ToList();

现在我有一个不同的ItemNumbers列表,我需要得到每个的总数,所以我循环字典:

foreach (string itemNumber in itemNumbers)
  {...

循环内部是我通过ItemNumber查询值的地方:

var qty = lines.Where(dict => dict.ContainsValue(itemNumber))
                    .Select(dict => dict["QUANTITY"])
                    .ToList();

下一个区域是我遇到问题的地方。我可以计算数量的总和吗?我试过这样的东西,但是得到编译器错误(这是可以理解的,我试图对一个字符串求和)

int sum = qty.Sum(x => Convert.ToDecimal(x.Value));

我得到“字符串不包含值的定义”...

我如何总结这些结果?

3 个答案:

答案 0 :(得分:3)

这是一个更简洁的版本,我们在第一个查询中执行求和:

 var sum = lines.Where(dict => dict.ContainsValue(itemNumber))
                .Sum(dict => Convert.ToDecimal(dict["QUANTITY"]));

答案 1 :(得分:1)

请勿使用Value字段,您已选择以下行中的值

var qty = lines.Where(dict => dict.ContainsValue(itemNumber))
          .Select(dict => dict["QUANTITY"]) // here you are selecting the value
          .ToList();

所以你不再使用KeyValuePair,而是使用价值。简单地总结转换

int sum = qty.Sum(x => Convert.ToDecimal(x));

如果要确保字符串是小数

,您可以Select使用更具弹性的转换函数为十进制数

答案 2 :(得分:1)

我会尝试这样的事情:

decimal sum = qty.Sum(x => !string.IsNullOrEmpty(x) ? Convert.ToDecimal(x) : 0);

我正在检查x对于边缘情况是否为空或空,其中Convert.ToDecimal将失败。