2010-11-12 28 views
9

Tengo un sistema de gestión de documentos donde los documentos pueden tener múltiples versiones. Cada versión se guarda y los usuarios pueden ver el historial de versiones.Números de versión flotante, decimal o doble

Lo que me gustaría saber es: ¿Qué tipo de datos debo usar para los números de versión? Decimal, Flotador o Doble? Estoy usando .NET y C#.

Los números de versión comienzan en 0,1 y cada publicados la versión importante será redondeado al siguiente número entero. es decir 0,4 va a 1,0 y 1,3 va a 2,0 etc.

Cuando un números de versión impacta 0,9 y un menor versión se añade Me gustaría que el número para ir a 0,10 no 1.0, cuando lo agrego. Este es el mayor problema.

Cualquier sugerencia es apreciada.

Gracias.

Respuesta

17

System.Version

Esto ya almacena las diferentes partes, trata de presentar como una cadena (revisión y construir componentes son solo se usan en la pantalla si no son cero, por lo que su irrelevancia para su caso no importa) y (lo mejor de todo) ya lo entienden otros desarrolladores de .NET, y no generará confusión (si vi algún uso) de un número de versión que no era un System.Version Pasé algún tiempo tratando de averiguar por qué Version no era lo suficientemente bueno para el trabajo, en caso de que demostrara ser importante y escondiera una desagradable sorpresa. Si fuera lo suficientemente bueno para el trabajo, me molestaría que el desarrollador perdiera mi tiempo así).

Puede tratar con los medios que desea para incrementar fácilmente con métodos de extensión:

public static Version IncrementMajor(this Version ver) 
{ 
    return new Version(ver.Major + 1, 0); 
} 
public static Version IncrementMinor(this Version ver) 
{ 
    return new Version(ver.Major, ver.Minor + 1); 
} 
+0

No estoy seguro de por qué su solución es tan baja. En mi opinión, siempre debemos usar implementaciones existentes cuando sea posible. –

+1

Me encantaría darle un voto positivo, pero he usado mi cuota para el día, así que tengo que volver y agregar un voto al día mañana. Claramente la mejor respuesta aquí. –

+0

Al menos es bueno que el OP haya cambiado la marca de verificación de mi respuesta a la respuesta de Jon Hanna que se muestra en la parte superior. –

5

¿Qué tal dos enteros? ¿Uno para revisiones mayores y uno para revisiones menores?

+0

Por supuesto! Gracias. – Jamie

1

Sugeriría dos enteros: uno mayor y uno menor. Incluso puede almacenar esto como major * 1000 + minor si quiere una variable.

1

Decimal debe ser el mejor de los anteriores, pero como otros han notado dos ints sería mejor.

dobles y los flotadores no almacena con precisión todos los valores decimales, que no quiere que su versión sea pronto 1,219999999999999999

+5

Y cuando agrega '0.1' a' 0.9', no obtendrá '0.10', como deseaba OP ... – Oded

2

Haga su propio tipo de datos para este

public struct VersionNumber : IComparable<ReleaseNumber> 
{ 
    public int MajorVersion{get;set;} 
    public int MinorVersion{get;set;} 

    public VersionNumber(int major, int minor) 
    { 
    MajorVersion = major; 
    MinorVersion = minor; 
    } 

    public override string ToString(){ 
    return major + '.' + minor; 
    } 

    public int CompareTo(VersionNumber other) { 
    int result; 
    result = MajorVersion.CompareTo(other.MajorVersion); 
    if (result != 0) { return result; } 
    return MinorVersion.CompareTo(other.MinorVersion); 
    } 
    public static bool operator <(VersionNumber left, VersionNumber right) { 
    return left.CompareTo(right) < 0; 
    } 
    public static bool operator <=(VersionNumber left, VersionNumber right) { 
    return left.CompareTo(right) <= 0; 
    } 
    public static bool operator >(VersionNumber left, VersionNumber right) { 
    return left.CompareTo(right) > 0; 
    } 
    public static bool operator >=(VersionNumber left, VersionNumber right) { 
    return left.CompareTo(right) >= 0; 
    } 
} 

También puede agregar un comparador para que pueda verificar dos números de versión para ver cuál es la versión más alta de dos números de versión, por ejemplo.

EDITAR

añadido la lógica comparador también por si acaso :)

+0

Finalmente, tengo una razón para usar una estructura. Gracias. – Jamie

+5

'System.Version' ya hace esto. –

+0

Ojalá pudiera + la respuesta de Jon Hanna nuevamente. No reinvente la rueda – Kell

Cuestiones relacionadas