0

文字列値 (response.Radius) をチェックして、最も近い Int16 値 (radius) に丸めようとしています。これを行うための最もクリーンで効率的な方法は何ですか? 私は次のコードを書きましたが、これが最も効率的なソリューションであることがわかりました。私は正しいですか?

また、catch ステートメントに保存する追加のログ情報もあります。

Int16 radius; Double rDouble;
            if (Double.TryParse(response.Radius, out rDouble))
            {
                var rRounded = Math.Round(rDouble);
                if (!Int16.TryParse(rRounded.ToString(), out radius))
                {
                    if (rRounded > Int16.MaxValue)
                    {
                        radius = Int16.MaxValue;
                    }
                    else if (rRounded < Int16.MinValue)
                    {
                        radius = Int16.MinValue;
                    }
                    //response.Radius = radius.ToString();
                    Logger.Info(String.Format("Received range value {0} is outside the range of SmallInt, thus it is capped to nearest value of SmallInt i.e. {2}", Int16.MaxValue, response.Radius));
                }
                else
                {
                    Logger.Info("Response: Range " + response.Radius + " is not a valid number");
                }
            }

return response.Radius;
4

3 に答える 3

2

より小さなコードが必要な場合は、Math.Minandを使用できMath.Maxます。

double d = 42793.5;

double rslt = Math.Min(Int16.MaxValue, Math.Max(Int16.MinValue, d));
于 2013-08-23T13:33:51.653 に答える
0

これは、私が書くことができる最小かつ正確なコードです。

Double rDouble;
if (Double.TryParse(response.Radius, out rDouble))
{
    var radius = Math.Round(Math.Min(Int16.MaxValue, Math.Max(Int16.MinValue, rDouble)));
    if (radius.ToString() != response.Radius))
    {
        Logger.Info(String.Format("Response: Received range value {0} is outside the range of SmallInt, thus it is capped to nearest value of SmallInt i.e. {1}", response.Radius, radius));
    }
    response.Radius = radius.ToString();
}
else
{
    Logger.Info("Response: Range " + response.Radius + " is not a valid number");
}
于 2013-08-23T14:03:16.277 に答える