4

私はいくつかのカスタムシリアライズを行っています。スペースを節約するために、可能な場合は値が賢明であれば、小数をintとしてシリアライズしたいと考えています。大量のデータを扱っているため、パフォーマンスが懸念されます。私が使用する現在の方法は次のとおりです。

if ((value > Int32.MinValue) && (value < Int32.MaxValue) && ((valueAsInt = Decimal.ToInt32(value)) == value))
{
    return true;
}

これは改善できますか?

4

6 に答える 6

1

負の値はありますか?MinValue チェックがあるので、そうであると思います。それ以外の場合はスキップできます。より多くの double 値を int に変換できる unsigned int を使用することもできます。

編集: また、正の数が多い場合は、最初の 2 つの条件を入れ替えることができます。そうすれば、最初のものが失敗する可能性が最も高くなり、比較の総数が減少します。

于 2010-04-29T18:18:25.247 に答える
1

無効化の基準は次のとおりです。

1) MaxValue より大きいか?

2) MinValue より小さいか?

3) 分数成分は含まれていますか?

あなたはそれらをカバーしているように聞こえます。私の実装は次のようになります。

public bool IsConvertibleToInt(decimal value)
{
    if(value > int.MaxValue)
       return false;

    if(value < int.MinValue)
       return false;

    if(Math.Floor(value) < value && Math.Ceiling(value) > value)
       return false;

    return true;
}
于 2010-04-29T15:32:32.867 に答える
1

これはどう。操作が少なくて済むはずだと思います(少なくとも比較の数は少なくなります):

    return (value == (Int32)value);

また、ifステートメントが単にブール値を返す場合は、比較を返すだけでよいことに注意してください。それだけで高速になる可能性があります (コンパイラが既にこれを最適化している場合を除きます)。if ステートメントを使用する必要がある場合は、同様にこれを行うことができます。

    if (value == (Int32)value)
    {
        //Do stuff...
    return true;
    }
    else
    {
        //Do stuff...
        return false;
    }

編集:これは実際には機能しないことに気づきました。Int32 キャストは 10 進数から最初の 32 ビットだけをコピーし、残りのビットを残す (そして例外をスローしない) と考えていましたが、残念ながら、そのようには機能しませんでした (言うまでもなく、すべて負の値)。

于 2010-04-29T15:33:49.790 に答える
1

それは、あなたが持っている、または本当に気にかけている小数点以下の桁数によって異なります。小数点以下 3 桁までしか気にしないと言える場合、int32 に格納できる最大の数値は int.MaxValue / 1000 です。正の数値のみを使用している場合は、uint を使用してより高い数値を取得できます。いずれにせよ、それを行う方法は、10 進数のスペースを一貫して予約し、* 1000 を使用してそれらをエンコードし、/ 1000 を使用して 10 進数に/からデコードすることです。

于 2010-04-29T15:39:03.603 に答える
0

次のようなことができないでしょうか。

if(Decimal.ToInt32(value) == value)
{
     return true;
}

.net の専門家ではありませんが、それだけで十分だと思います。また、最小値/最大値も有効であるため、2 つの比較演算子は「または等しい」必要があります。

編集:コメントで指摘されているように、これは例外をスローします。例外をキャッチして false を返すこともできますが、その時点で最小/最大テストを自分で行う方がはるかに高速です。

于 2010-04-29T15:33:00.803 に答える
0

「valueAsInt =」は必要ありません。(Decimal.ToInt32(value) == value)) は、1 つ少ない割り当てで同じ結果が得られると思います。ある種の出力パラメーターとして valueAsInt を使用していますか?

于 2010-04-29T15:34:18.687 に答える