如何在Linq中测试字符串是否可以转换为十进制
本文关键字:转换 十进制 是否 字符串 Linq 测试 | 更新日期: 2023-09-27 18:27:36
我正试图使用Linq-to-XML从XML中提取一些数据,我有以下代码:
commisionPct = XDocument.Parse(commissionXml)
.Descendants("Range")
.Attributes("commission")
.Select(x => Convert.ToDecimal(x.Value))
.FirstOrDefault();
问题是,如果x.Value
不是十进制,我不希望它异常。通常我会使用decimal.TryParse
,但我不确定在linq语句中有什么干净的方法可以做到这一点。我想我可以用一个尝试/接球的盖帽来包围这个,但我很好奇是否有更好的方法在林克内部做到这一点。
如果不是十进制,我希望它返回十进制默认值(0)。
这样更改Select
:
//Linq
.Select(
x =>
{
Decimal d;
Decimal.TryParse(x.Value, out d);
return d;
})
.FirstOrDefault();
或者,创建一个方法来处理它。
//Linq
.Select(x => DecimalTryParseOrZero(x.Value))
.FirstOrDefault();
Decimal DecimalTryParseOrZero(String input)
{
Decimal d;
Decimal.TryParse(x.Value, out d);
return d;
}
您可以使用TryParse
并使其以可为null的十进制形式返回结果:
.Select(x => {
decimal n;
return Decimal.TryParse(x.Value, out n) ? n : (decimal?)null
})
您仍然可以使用decimal.TryParse
。这里有一个简单的例子:
var strings = new List<string> { "1", "2", "3", "4", "cow",
"duck", "23", "42", "linq" };
decimal d = 0;
var nums = from x in strings
select decimal.TryParse(x, out d) ? d : 0;
使用方法语法的示例,它看起来像这样:
decimal d = 0;
commisionPct = XDocument.Parse(commissionXml)
.Descendants("Range")
.Attributes("commission")
.Select(x => decimal.TryParse(x, out d) ? d : 0)
.FirstOrDefault();