首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ查询中的Decimal.TryParse -如何使用out参数并避免二次转换

LINQ查询中的Decimal.TryParse -如何使用out参数并避免二次转换
EN

Stack Overflow用户
提问于 2019-02-22 04:48:20
回答 3查看 438关注 0票数 3

我正在使用LINQ to XML查询遍历XML文件并收集余额为正的节点。XML可能有一个空的balance节点,或者包含不能转换为decimal的内容,所以我已经进行了检查以跳过这些值。其中一个检查使用decimal.TryParse()查看是否可以将平衡节点的内容转换为小数。如果它可以转换,我有一个后续的Where子句来执行转换。

XML结构:

代码语言:javascript
复制
<Invoice>
...
  <balance>Could be any string here or empty</balance>
...
</Invoice>

代码:

代码语言:javascript
复制
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参数,而不是再次执行十进制转换?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-22 04:53:44

只需与TryParse进行比较即可。您可以利用C#7特性,它允许您以行的方式声明值。

例如:

代码语言:javascript
复制
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将会处理,所以你也可以放弃检查。最后,你可以用下面的代码得到你想要的结果:

代码语言:javascript
复制
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => decimal.TryParse(x.Element("balance").Value, out var val) && val > 0);
票数 3
EN

Stack Overflow用户

发布于 2019-02-22 04:54:23

是的,你可以这样做:

代码语言:javascript
复制
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函数中使用&&将多个断言链接在一起,它等同于和。

票数 1
EN

Stack Overflow用户

发布于 2019-02-22 05:12:15

尝试编写一个实用程序扩展方法,将XElement转换为Decimal。在这种情况下,您可以将非十进制值视为零,因为您只对正值感兴趣。如果您想区分实际的0值和非十进制值,那么该方法可以返回可空的decimal。

代码语言:javascript
复制
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“元素本身缺失的情况。

代码语言:javascript
复制
var resultsWithPositiveBalance = xml.Descendants("Invoice")
         .Where(x => !x.Element("balance").ToDecimal() > 0);

如果您最终使用的是decimal?版本:

代码语言:javascript
复制
var resultsWithPositiveBalance = xml.Descendants("Invoice")
         .Where(x => (!x.Element("balance").ToDecimal() ?? 0 ) > 0);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54815971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档