Pregunta

Estoy haciendo serialización personalizada, y con el fin de ahorrar algo de espacio, quiero serializar los decimales como int, si es posible valor sabia. El rendimiento es una preocupación, ya que estoy tratando con un gran volumen de datos. El uso actual método i es:

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

¿Se puede mejorar?

¿Fue útil?

Solución

¿Tiene alguna valores negativos? Supongo que sí ya que tienes el cheque MinValue, de lo contrario se puede omitir. Incluso se puede utilizar entero sin signo que le permitirá convertir más de sus valores dobles en enteros.

Editar Además, si usted tiene más números positivos, puede intercambiar las dos primeras condiciones. De esa manera el primero es el más probable que falle, la disminución del número total de comparaciones.

Otros consejos

Sus criterios de invalidación son:

1) ¿Es mayor que MaxValue?

2) ¿Es menor que MinValue?

3) ¿Contiene un componente fraccional?

Parece que usted los tiene cubiertos. Mi aplicación sería:

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

¿Qué hay de esto. Creo que debería tener un menor número de operaciones (al menos un menor número de comparaciones):

    return (value == (Int32)value);

Asimismo, recuerda, si una declaración if simplemente devuelve un valor lógico, sólo puede devolver la comparación. Eso por sí solo podría hacerlo más rápido (a menos que el compilador ya se optimiza para esto). Si usted tiene que utilizar la sentencia if, puede hacerlo de forma similar al siguiente:

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

EDIT: Me di cuenta que en realidad no trabajo. Estaba pensando en el elenco Int32 que acaba de copiar en los primeros 32 bits de la decimal, dejando tras de sí ningún bits restantes (y no una excepción), pero por desgracia, no funcionó de esa manera (por no hablar de que sería un error para todos los valores negativos).

Depende de cuántos decimales que tiene o realmente se preocupan. Si usted podría decir que sólo se preocupan por hasta 3 cifras decimales entonces el número más grande que puede almacenar en int32 es int.MaxValue / 1000. Si sólo se trabaja con números positivos, entonces puede obtener un número más alto utilizando uint. En cualquier caso la forma de hacerlo es al espacio constantemente de reserva para el decimal y el uso * 1000 para codificar ellos y / 1000 para decodificar ellos a / desde decimal.

No hay necesidad de "valueAsInt =". Creo (Decimal.ToInt32 (valor) == valor)) se obtiene el mismo resultado con uno menos asignación. ¿Está utilizando valueAsInt como una especie de parámetro de salida?

¿No sería capaz de simplemente hacer algo como:

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

No es un experto en .NET, pero creo que debería ser todo lo que había requieren. También, sus dos operadores comparaciones deben 'o igual' desde el min / max valores también son válidas.

Edit: Como se señaló en el comentario, esto sería una excepción. Usted podría intentar agarrar la excepción y devolver falsa, pero en ese momento probablemente sería mucho más rápido para hacer el min / max prueba usted mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top