2010-11-12 11 views
9

Ho un sistema di gestione dei documenti in cui i documenti possono avere più versioni. Ogni versione viene salvata e gli utenti possono visualizzare la cronologia delle versioni.Numeri di versione float, decimal o double

Quello che mi piacerebbe sapere è: Quale tipo di dati dovrei usare per i numeri di versione? Decimale, galleggiante o doppio? Sto usando .NET e C#.

I numeri di versione partono 0,1 e ciascuno pubblicati importante versione sarà arrotondato al successivo numero intero. cioè 0,4 va a 1.0 e 1.3 va a 2,0 ecc

Quando un numero di versione colpisce 0.9 e un minore versione viene aggiunto Vorrei il numero di andare a 0,10 non 1.0, quando aggiungo ad esso. Questo è il problema più grande.

Qualsiasi suggerimento è gradito.

Grazie.

risposta

17

System.Version

Questo memorizza già le diverse parti, si occupa di presentarla come una stringa (revisione e costruire componenti sono utilizzati solo in visualizzazione se non sono zero, quindi la loro irrilevanza per il tuo caso non ha importanza) e (il migliore di tutti) è già compresa da altri sviluppatori .NET e non porterà a confusione (se ne vedessi un uso di un numero di versione che non era uno System.Version Trascorrere un po 'di tempo cercando di capire perché Version non era abbastanza buono per il lavoro, nel caso in cui ciò si rivelasse importante e nascondesse una brutta sorpresa. Se fosse abbastanza buono per il lavoro, sarei irritato dal fatto che lo sviluppatore sprecasse il mio tempo in quel modo).

Si può trattare con i mezzi che si desidera per incrementare facilmente con i metodi di estensione:

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

Non sei sicuro del motivo per cui la tua soluzione ha un punteggio così basso. Secondo me dovremmo sempre usare le implementazioni esistenti quando possibile. –

+1

Mi piacerebbe dare il suo upvote, ma ho usato la mia quota per il giorno, quindi devo tornare e aggiungere un upvote domani. Chiaramente la migliore risposta qui. –

+0

Almeno bene che l'OP ha cambiato il segno di spunta dalla mia risposta a quella di Jon Hanna per la sua risposta è mostrata in alto. –

5

E a proposito di due numeri interi? Uno per maggiori e uno per le revisioni minori?

+0

Certo! Grazie. – Jamie

1

Suggerirei due numeri interi: uno maggiore e uno minore. Puoi anche memorizzare questo come major * 1000 + minor se vuoi una variabile.

1

Decimale dovrebbe essere il migliore di quanto sopra, ma come altri ha notato due intere sarebbe meglio.

doppie e carri non accuratamente memorizzare tutti i valori decimali, non si vuole la versione di essere improvvisamente 1,219999999999999999

+5

E quando aggiungi '0.1' a' 0.9', non otterrai '0.10', come l'OP voleva ... – Oded

2

Crea il tuo tipo di dati per questo

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

È inoltre possibile aggiungere un operatore di confronto quindi puoi controllare due numeri di versione per vedere quale è la versione più alta di due numeri di versione, per esempio.

EDIT

Aggiunto la logica di confronto anche per buona misura :)

+0

Infine, ho un motivo per usare una struct. Grazie. – Jamie

+5

'System.Version' lo fa già. –

+0

Vorrei poter + la risposta di Jon Hanna di nuovo. Non reinventare la ruota – Kell