【问题标题】:Sum Dictionary value by Key按键对字典值求和
【发布时间】:2014-04-09 13:59:15
【问题描述】:

我有一个使用 XDocument 解析的 XML 文档:

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();

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

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

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

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));

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

我如何总结这些结果?

【问题讨论】:

    标签: c# linq dictionary


    【解决方案1】:

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

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

    【讨论】:

    • 一个小改动(.Sum(dict => Convert.ToDecimal(dict["QUANTITY"]))),但效果很好!谢谢
    【解决方案2】:

    不要使用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使用更具弹性的转换函数到十进制

    【讨论】:

    • 虽然我更喜欢 Chris Hardie 的方法,但我喜欢你指出我不知何故忽略的明显...
    • 谢谢,我赞成他对优化的回答。虽然有时 Linq 单线在这种情况下会变得有点复杂,但它确实很容易应用而不是棘手。
    【解决方案3】:

    我会尝试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多