Vergleichen Sie die Versionsnummern ohne die Split-Funktion

124

Wie vergleiche ich Versionsnummern?

Zum Beispiel:

x = 1,23,56,1487,5

y = 1,24,55,487,2

Sankar M.
quelle
4
Was soll das Ergebnis sein?
BoltClock
4
eine Version mit 5 Teilen? Wenn Sie die typische 4-teilige Version verwenden, können Sie die System.Version-Klasse verwenden, die Methoden zum Vergleichen von Versionen und zum
Analysieren
1
Was sind die Arten von x und y?
Gleno
5
Jedes Mal , wenn jemand sagt : „Verwenden Sie nicht X, Yoder Z“ es macht mich immer gefragt , warum. Warum möchten Sie die splitFunktion nicht verwenden? Die splitFunktion scheint eine gute Möglichkeit zu sein, wenn Sie die System.VersionKlasse nicht verwenden.
Bob2Chiv

Antworten:

294

Können Sie die Versionsklasse verwenden?

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

Es hat eine IComparable-Schnittstelle. Beachten Sie, dass dies mit einer 5-teiligen Versionszeichenfolge, wie Sie gezeigt haben, nicht funktioniert (ist das wirklich Ihre Versionszeichenfolge?). Angenommen, Ihre Eingaben sind Zeichenfolgen, finden Sie hier ein Arbeitsbeispiel mit der normalen 4-teiligen .NET-Versionszeichenfolge:

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;

    }
}
JohnD
quelle
5
Nur wenn die Version aus 2-4 Teilen besteht
Benutzername
@dev_Boston nur eine Ausnahme ... mach einfach mit diesen Werten v1 = 1.0001 und v2 = 1.1. es gibt mir gleich.
Sankar M
8
Ja, die Versionszeichenfolgen sind keine Dezimalzeichenfolgen, und es ist irrelevant, einem Teil der Versionsnummer Nullen voranzustellen. Mit anderen Worten, "00001" ist gleich "1" im 2. Teil der Versionszeichenfolge.
JohnD
8
Sie können besser lesbar vergleichen Version.Parse(v1) < Version.Parse(v2), da operator >(Version v1, Version v2)implementiert ist.
Andrey Moiseev
Beachten Sie, dass Version.Parse ("6.0.0") kleiner als (<) Version.Parse ("6.0.0.0") ist (dh NICHT gleich ist). Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
Adospace
13

Wenn Sie mit dem Schema major.minor.build.revision leben können, können Sie die Klasse .Net Version verwenden . Andernfalls müssten Sie eine Art Parsing von links nach rechts implementieren und fortfahren, bis Sie einen Unterschied feststellen oder zurückgeben, dass zwei Versionen gleich sind.

Andreas
quelle
7

Zusätzlich zur Antwort von @JohnD müssen möglicherweise nur Teilversionsnummern verglichen werden, ohne Split ('.') Oder einen anderen String <-> int Conversion Bloat zu verwenden. Ich habe gerade eine Erweiterungsmethode CompareTo mit 1 zusätzlichen Argument geschrieben - Anzahl der zu vergleichenden signifikanten Teile der Versionsnummer (zwischen 1 und 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; 
    }
}
auch
quelle
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;
    }
user3790307
quelle
14
compareVersion("1.3", "1.3.1")
Beachten
1

Wenn Sie aus irgendeinem Grund die Vergleichsmethode der Version nicht direkt verwenden dürfen (z. B. in einem Client-Server-Szenario), besteht ein anderer Ansatz darin, eine lange Zahl aus der Version zu extrahieren und die Zahlen dann miteinander zu vergleichen. Die Nummer muss jedoch das folgende Format haben: Zwei Ziffern für Major, Minor und Revision und vier für Build.

So extrahieren Sie die Versionsnummer:

var version = Assembly.GetExecutingAssembly().GetName().Version;

long newVersion = version.Major * 1000000000L + 
                   version.Minor * 1000000L + 
                   version.Build * 1000L + 
                   version.Revision;

Und woanders kann man einfach vergleichen:

if(newVersion > installedVersion)
{
  //update code
}

Hinweis: Die installierte Version ist eine zuvor extrahierte lange Nummer

Fabian Bigler
quelle
Um allen Ziffern 3 Stellen zu geben, sollte der Code tatsächlich lauten: "version.Major * 1000000000L + version.Minor * 1000000L + version.Build * 1000L + version.Revision"
Stef Heyenrath
1
@StefHeyenrath Das ist richtig, Sie können den obigen Code jederzeit an Ihre eigenen Bedürfnisse anpassen.
Fabian Bigler