我正在尝试使用Linq to XML从XML中提取一些数据,我有以下代码:
commisionPct = XDocument.Parse(commissionXml)
.Descendants("Range")
.Attributes("commission")
.Select(x => Convert.ToDecimal(x.Value))
.FirstOrDefault();
问题是如果x.Value
不是小数,我不希望它出现异常。通常我会使用decimal.TryParse
,但我不确定在linq语句中做一个干净的方法。我想我可以使用try / catch块来包围它,但我很好奇是否有更好的方法在Linq中执行此操作。
如果它不是小数,我希望它返回十进制默认值(0)。
答案 0 :(得分:7)
像这样更改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;
}
答案 1 :(得分:2)
您可以使用TryParse
并将结果作为可以为空的十进制返回:
.Select(x => {
decimal n;
return Decimal.TryParse(x.Value, out n) ? n : (decimal?)null
})
答案 2 :(得分:1)
您仍然可以使用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();