我正在使用LINQ to XML查询遍历XML文件并收集余额为正的节点。XML可能有一个空的balance节点,或者包含不能转换为decimal的内容,所以我已经进行了检查以跳过这些值。其中一个检查使用decimal.TryParse()
查看是否可以将平衡节点的内容转换为小数。如果它可以转换,我有一个后续的Where子句来执行转换。
XML结构:
<Invoice>
...
<balance>Could be any string here or empty</balance>
...
</Invoice>
代码:
decimal convertedDecimalButUnused;
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => !x.Element("balance").IsEmpty);
.Where(x => Decimal.TryParse(x.Element("balance").Value, out convertedDecimalButUnused))
.Where(x => Convert.ToDecimal(x.Element("balance").Value) > 0);
我的问题是,我是否可以使用decimal.TryParse()
的out
参数,而不是再次执行十进制转换?
发布于 2019-02-22 04:53:44
只需与TryParse进行比较即可。您可以利用C#7特性,它允许您以行的方式声明值。
例如:
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => !x.Element("balance").IsEmpty);
.Where(x => Decimal.TryParse(x.Element("balance").Value, out var val) && val > 0)
因为如果元素已经是空的,TryParse将会处理,所以你也可以放弃检查。最后,你可以用下面的代码得到你想要的结果:
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => decimal.TryParse(x.Element("balance").Value, out var val) && val > 0);
发布于 2019-02-22 04:54:23
是的,你可以这样做:
decimal convertedDecimalButUnused;
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => !x.Element("balance").IsEmpty);
.Where(x => Decimal.TryParse(x.Element("balance").Value, out convertedDecimalButUnused) && convertedDecimalButUnused > 0);
您可以在Where函数中使用&&
将多个断言链接在一起,它等同于和。
发布于 2019-02-22 05:12:15
尝试编写一个实用程序扩展方法,将XElement转换为Decimal。在这种情况下,您可以将非十进制值视为零,因为您只对正值感兴趣。如果您想区分实际的0值和非十进制值,那么该方法可以返回可空的decimal。
public static class UtilityExtensions {
// return decimal? to differentiate between real zero and non-decimal values
public static decimal ToDecimal(this XElement element){
if(element == null || element.IsEmpty) return 0; // return null for decimal?
decimal value;
// if you can use C# 7, code can be more succinct with inline declaration
return Decimal.TryParse(element.Value, out value) ? value : 0; // return null instead of 0 for decimal?
}
}
现在你的LINQ就简单多了。这也将处理"balance“元素本身缺失的情况。
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => !x.Element("balance").ToDecimal() > 0);
如果您最终使用的是decimal?
版本:
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => (!x.Element("balance").ToDecimal() ?? 0 ) > 0);
https://stackoverflow.com/questions/54815971
复制相似问题