138 votes

Comparez les numéros de version sans utiliser la fonction de division

Comment comparer les numéros de version ?

Par exemple:

x = 1.23.56.1487.5

y = 1,24.55.487,2

324voto

JohnD Points 6811

Pouvez-vous utiliser la classe Version ?

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

Il a une interface IComparable. Sachez que cela ne fonctionnera pas avec une chaîne de version en 5 parties comme vous l'avez montré (est-ce vraiment votre chaîne de version ?). En supposant que vos entrées sont des chaînes, voici un exemple de travail avec la chaîne de version .NET normale en 4 parties :

 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;

    }
}

13voto

Andreas Points 3896

Si vous pouvez vivre avec le schéma major.minor.build.revision, vous pouvez utiliser la classe .Net Version. Sinon, vous devrez implémenter une sorte d'analyse de gauche à droite et continuer jusqu'à ce que vous ayez une différence ou que les deux versions soient égales.

7voto

too Points 1284

En plus de la réponse de @JohnD, il peut être nécessaire de comparer uniquement les numéros de version partiels sans utiliser Split('.') ou une autre chaîne <-> int conversion bloat. 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; 
    }
}

4voto

user3790307 Points 1
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;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X