如何在Linq中测试字符串是否可以转换为小数?

时间:2012-03-13 19:45:26

标签: c# linq

我正在尝试使用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)。

3 个答案:

答案 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();