5

多くのステートメントを次々に実行する必要があり、単一のステートメントが例外をスローしたときに、プログラムのフローが次のステートメントの実行を継続する必要があります。次に例を示します。

double a = Double.Parse("2.5");
double b = Double.Parse("ADFBBG");
Geometry g = Geometry.Parse("M150,0L75,200 225,200z");

すべてのステートメントを実行する必要があるため、カスケードに一種の try-catch ブロックが必要です。

double a, b;
Geometry g;

try
{
   a = Double.Parse("2.5");
}
catch
{}

try
{
   b = Double.Parse("ADFBBG");
}
catch
{}

try
{
   g = Geometry.Parse("M150,0L75,200 225,200z");
}
catch
{}

明らかに、これは私のプログラムを書く最も洗練された方法ではありません。より良い方法はありますか (よりエレガントで、パフォーマンスを大幅に低下させません)。

私はFunc<TResult>そのような方法でデリゲートを使用してみました:

私は次の方法を書きました:

T Try<T>(Func<T> func)
{
    try
    {
        return func();
    }
    catch
    {
        return default(T);
    }
}

したがって、次のように使用できます。

double x = Try(() => Double.Parse("77"));
Geometry g = Try(() => Geometry.Parse("M150,0L75,200 225,200z"));

他の解決策?

4

4 に答える 4

0

Double.TryParseを使用します。

変換が成功したかどうかを示す値を返します。したがって、次の方法で使用できます。

double converted;
bool success = Double.TryParse(value, out converted);

if (success)
{
    // Do whatever you want
    // The converted value is in the variable 'covnerted'
}
于 2013-11-03T10:43:57.450 に答える
-1

例外のスローとキャッチによるパフォーマンスの低下がないため、TryParse の方が適しています。

上記のコードのもう 1 つの不正確さ - 解析された "0" とデフォルト (T) の間に違いはありません。

コードはあなたのものより速い

public static class StringExt
    {
        public static double ParseDouble(this string value)
        {
            double result;
            Double.TryParse(value, out result);
            return result;
        }

    }
于 2013-11-03T10:37:06.443 に答える
-1

数日前に同様の質問に回答しました。文字列値のコレクションがある場合は、拡張メソッドの力を使用してそれを行うことができます。

static public IEnumerable<double> ConvertToDouble(this IEnumerable<string> source)
{
    double x = 0;
    var result = source.Where(str => Double.TryParse(str, out x))
                        .Select (str => x);

    return result;      
}

したがって、すべてをコレクションに入れて使用し、.AsEnumerable()その後にConvertToDouble()拡張メソッドを使用します。解析できないものはすべて例外なく無視され、結果はIEnumerable<Double>

元の回答: C# で List<string> を List<int> に変換します

/編集:反対票を投じた人は説明したいですか?OPは、try catchを使用したい理由を明確にしておらず、例外が発生した場合に何をしなければならないかを説明していません。例外が発生した場合に備えて、彼は何もしたくないと思います。

于 2013-11-03T10:43:07.133 に答える