如何在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)。

如何在Linq中测试字符串是否可以转换为十进制

这样更改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();