2011-09-27 6 views
81

Come si confrontano i numeri di versione?Confronta i numeri di versione senza utilizzare la funzione di divisione

Per esempio:

x = 1.23.56.1487.5

y = 1.24.55.487.2

+4

Che cosa vuoi che il risultato sia? – BoltClock

+3

una versione con 5 parti? Se si stesse utilizzando la tipica versione a 4 parti, è possibile utilizzare la classe System.Version, che include metodi per confrontare versioni e analizzare la stringa di versione – psousa

+1

Quali sono i tipi di x e y? – Gleno

risposta

193

Potete utilizzare la classe Version?

http://msdn.microsoft.com/en-us/library/system.version.aspx

Ha un'interfaccia IComparable. Sappi che questo non funzionerà con una stringa di versione in 5 parti come hai mostrato (è davvero la tua stringa di versione?). Assumendo gli ingressi sono stringhe, ecco un campione di lavoro con il normale .NET 4 parti versione stringa:

static class Program 
{ 
    static void Main() 
    { 
     string v1 = "1.23.56.1487"; 
     string v2 = "1.24.55.487"; 

     var version1 = new Version(v1); 
     var version2 = new Version(v2); 

     var result = version1.CompareTo(version2); 
     if (result > 0) 
      Console.WriteLine("version1 is greater"); 
     else if (result < 0) 
      Console.WriteLine("version2 is greater"); 
     else 
      Console.WriteLine("versions are equal"); 
     return; 

    } 
} 
+3

Solo se la versione è composta da 2-4 parti – username

+0

@dev_Boston solo un'eccezione ... basta fare con questi valori v1 = 1.0001 e v2 = 1.1 .it mi dà uguale. –

+7

Sì, le stringhe di versione non sono stringhe decimali e gli zero iniziali di una parte del numero di versione sono irrilevanti. In altre parole, "00001" è uguale a "1" nella seconda parte della stringa di versione. – JohnD

8

Se si può vivere con lo schema major.minor.build.revision è possibile utilizzare la classe .NET Version . Altrimenti dovresti implementare qualche tipo di analisi da sinistra a destra e continuare fino a quando non avrai una differenza o restituirai che due versioni sono uguali.

4
public int compareVersion(string Version1,string Version2) 
    { 
     System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"([\d]+)"); 
     System.Text.RegularExpressions.MatchCollection m1 = regex.Matches(Version1); 
     System.Text.RegularExpressions.MatchCollection m2 = regex.Matches(Version2); 
     int min = Math.Min(m1.Count,m2.Count); 
     for(int i=0; i<min;i++) 
     { 
      if(Convert.ToInt32(m1[i].Value)>Convert.ToInt32(m2[i].Value)) 
      { 
       return 1; 
      } 
      if(Convert.ToInt32(m1[i].Value)<Convert.ToInt32(m2[i].Value)) 
      { 
       return -1; 
      }    
     } 
     return 0; 
    } 
+5

Attenzione che questo restituirà equals per 'compareVersion (" 1.3 "," 1.3.1 ")' –

0

Oltre a @JohnD 'risposta s ci potrebbe essere la necessità di confrontare i numeri di versione solo parziali senza l'utilizzo di Split (' '.) O di altra stringa < -> int gonfiare la conversione. Ho appena scritto un metodo di estensione CompareTo con 1 argomento aggiuntivo: numero di parti significative del numero di versione da confrontare (tra 1 e 4).

public static class VersionExtensions 
{ 
    public static int CompareTo(this Version version, Version otherVersion, int significantParts) 
    { 
     if(version == null) 
     { 
      throw new ArgumentNullException("version"); 
     } 
     if(otherVersion == null) 
     { 
      return 1; 
     } 

     if(version.Major != otherVersion.Major && significantParts >= 1) 
      if(version.Major > otherVersion.Major) 
       return 1; 
      else 
       return -1; 

     if(version.Minor != otherVersion.Minor && significantParts >= 2) 
      if(version.Minor > otherVersion.Minor) 
       return 1; 
      else 
       return -1; 

     if(version.Build != otherVersion.Build && significantParts >= 3) 
      if(version.Build > otherVersion.Build) 
       return 1; 
      else 
       return -1; 

     if(version.Revision != otherVersion.Revision && significantParts >= 4) 
      if(version.Revision > otherVersion.Revision) 
       return 1; 
      else 
       return -1; 

     return 0; 
    } 
} 
Problemi correlati