2012-03-13 4 views
0

私は、XMLへのLINQを使用してXMLからいくつかのデータを抽出しようとしている、と私は、次のコードを持っている:Linqで文字列を10進数に変換できるかどうかをテストするにはどうすればよいですか?

  commisionPct = XDocument.Parse(commissionXml) 
            .Descendants("Range") 
            .Attributes("commission") 
            .Select(x => Convert.ToDecimal(x.Value)) 
            .FirstOrDefault(); 

問題はx.Valueは小数点でない場合、私は例外にそれをしたくないです。通常、私はdecimal.TryParseを使用したいと思いますが、linq文の内部でこれを行うためのきれいな方法はわかりません。私はtry/catchブロックでこれを囲むことができたと思いますが、Linq内部でこれを行うより良い方法があれば私は興味がありました。

10進でない場合は、小数点のデフォルト値(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; 
} 
+0

それは 'TryParse'を呼び出す前にゼロに変数を設定することは無意味です。値は常にそのメソッドが置く値に置き換えられます(値が解析できない場合はゼロになります)。 – Guffa

+0

良い点、私はそれを別に書いて、私はメソッドをトリムダウンしたときにそれを取ることを忘れてしまった。 – DaveShaw

2

あなたはTryParseを使用して、それがNULL可能で、小数点として結果を返すことができます:あなたはまだdecimal.TryParseを使用することができます

.Select(x => { 
    decimal n; 
    return Decimal.TryParse(x.Value, out n) ? n : (decimal?)null 
}) 
1

。ここでは簡単な例です:メソッドの構文を使用しての例を使用して

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(); 
+0

解析できない場合は0を選択しません。 – DaveShaw

+0

この例では、OPで規定されているように、10進ではない文字列に対してゼロを返すように修正しました。 – FishBasketGordo