Comment comparer les numéros de version?
Par exemple:
x = 1.23.56.1487.5
y = 1.24.55.487.2
Pouvez-vous utiliser la classe Version?
http://msdn.Microsoft.com/en-us/library/system.version.aspx
Il a une interface incomparable. Sachez que cela ne fonctionnera pas avec une chaîne de version en 5 parties, comme vous l'avez montré (s'agit-il vraiment de votre chaîne de version?). En supposant que vos entrées soient des chaînes, voici un exemple de travail avec la chaîne de version .NET en 4 parties normale:
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;
}
}
Si vous pouvez vivre avec le schéma major.minor.build.revision, vous pouvez utiliser .Net Version class. Sinon, vous devrez mettre en œuvre une sorte d'analyse syntaxique de gauche à droite et continuer jusqu'à ce que vous obteniez une différence ou renvoyer deux versions égales.
En plus de la réponse de @JohnD, il pourrait être nécessaire de comparer uniquement les numéros de version partiels sans utiliser Split ('.') Ou une autre chaîne <-> int Conversion gonfle. Je viens d'écrire une méthode d'extension CompareTo avec 1 argument supplémentaire - nombre de parties significatives du numéro de version à comparer (entre 1 et 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;
}
}
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;
}
Si, pour une raison quelconque, vous n'êtes pas autorisé à utiliser directement la méthode de comparaison de la version (par exemple, dans un scénario client-serveur), une autre approche consiste à extraire un nombre long de la version, puis à comparer les nombres les uns avec les autres ..__ Toutefois, le numéro doit avoir le format suivant: deux chiffres pour les majeures, les mineures et les révisions et quatre pour la construction.
Comment extraire le numéro de version:
var version = Assembly.GetExecutingAssembly().GetName().Version;
long newVersion = version.Major * 1000000000L +
version.Minor * 1000000L +
version.Build * 1000L +
version.Revision;
Et puis, ailleurs, vous pouvez simplement comparer:
if(newVersion > installedVersion)
{
//update code
}
Remarque: installedVersion est un nombre long précédemment extrait.