Domanda

sto facendo un po 'di serializzazione su misura, e al fine di risparmiare un po' di spazio, voglio serializzare i decimali come int, se possibile valore saggia. Le prestazioni sono un problema, dal momento che ho a che fare con un elevato volume di dati. L'attuale utilizzo metodo che è:

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

Può questo essere migliorato?

È stato utile?

Soluzione

Avete valori negativi? Sto indovinando sì visto che hai il controllo MinValue, altrimenti si può saltare. Si potrebbe anche usare unsigned int che vi permetterà di convertire più dei vostri valori doppi in int.

Modifica Inoltre, se si dispone di più numeri positivi, è possibile scambiare le prime due condizioni. In questo modo il primo è il più probabilità di fallire, diminuendo il numero totale di confronti.

Altri suggerimenti

I tuoi criteri di invalidazione sono:

1) E 'maggiore di MaxValue?

2) E 'più piccolo di MinValue?

3) Contiene un componente frazionale?

Sembra che li hai coperti. La mia applicazione potrebbe essere:

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;
}

Come su questo. Penso che dovrebbe prendere meno operazioni (almeno un numero minore di confronti):

    return (value == (Int32)value);

Ricorda anche, se una dichiarazione if restituisce semplicemente un valore booleano, si può semplicemente restituire il confronto. Che da solo potrebbe renderlo più veloce (a meno che il compilatore ottimizza già per questo). Se è necessario utilizzare l'istruzione if, si può fare questo in modo simile:

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

Modifica Mi rendo conto che questo non funziona veramente. Stavo pensando al cast Int32 sarebbe basta copiare e nei primi 32 bit del decimale, lasciando dietro di sé tutti i bit rimanenti (e non un'eccezione), ma ahimè, non ha funzionato in questo modo (per non parlare sarebbe sbagliato per tutti i valori negativi).

Dipende da quanti decimali luoghi che hai o ha realmente a cuore. Se si potesse dire che mi interessa solo fino a 3 cifre decimali quindi il maggior numero è possibile memorizzare in Int32 è int.MaxValue / 1000. Se si sta lavorando solo con i numeri positivi allora si può ottenere un numero maggiore utilizzando uint. In ogni caso il modo per farlo è quello di uno spazio costantemente riserva per il decimale e l'uso * 1000 a codificarli e / 1000 per la decodifica loro per / da decimale.

Non c'è bisogno di "valueAsInt =". Credo (Decimal.ToInt32 (valore) == value)) si ottiene lo stesso risultato con un incarico meno. Si sta utilizzando valueAsInt come una sorta di parametro di uscita?

Non ti basta essere in grado di fare qualcosa di simile:

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

Non è un esperto di .net, ma penso che dovrebbe essere tutto ciò che avrebbe bisogno. Inoltre, i vostri due operatori confronto va 'o uguale' dal momento che il valori min / max sono anche validi.

Edit: Come sottolineato nel commento, questo sarebbe un'eccezione. Si potrebbe provare la cattura l'eccezione e il ritorno falso, ma a quel punto probabilmente sarebbe molto più veloce di fare il / testing massimo minimo da soli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top