按键求和字典值
本文关键字:字典 求和 | 更新日期: 2023-09-27 17:57:39
我有一个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的列表,我需要获得每个的总数,所以我循环Dictionary:
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));
我得到"字符串不包含值的定义"。。。
如何对这些结果求和?
这里有一个更简洁的版本,我们在第一个查询中执行求和:
var sum = lines.Where(dict => dict.ContainsValue(itemNumber))
.Sum(dict => Convert.ToDecimal(dict["QUANTITY"]));
不要使用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
转换为十进制我会尝试这样的东西:
decimal sum = qty.Sum(x => !string.IsNullOrEmpty(x) ? Convert.ToDecimal(x) : 0);
我正在检查x
对于边缘情况是否为null或为空,在这种情况下Convert.ToDecimal
将失败。