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.
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:
staticclassProgram{staticvoidMain(){string v1 ="1.23.56.1487";string v2 ="1.24.55.487";var version1 =newVersion(v1);var version2 =newVersion(v2);var result = version1.CompareTo(version2);if(result >0)Console.WriteLine("version1 is greater");elseif(result <0)Console.WriteLine("version2 is greater");elseConsole.WriteLine("versions are equal");return;}}
@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.
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).
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
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.
X
,Y
oderZ
“ es macht mich immer gefragt , warum. Warum möchten Sie diesplit
Funktion nicht verwenden? Diesplit
Funktion scheint eine gute Möglichkeit zu sein, wenn Sie dieSystem.Version
Klasse nicht verwenden.Antworten:
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:
quelle
Version.Parse(v1) < Version.Parse(v2)
, daoperator >(Version v1, Version v2)
implementiert ist.Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
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.
quelle
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).
quelle
quelle
compareVersion("1.3", "1.3.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:
Und woanders kann man einfach vergleichen:
Hinweis: Die installierte Version ist eine zuvor extrahierte lange Nummer
quelle