versi dengan 5 bagian? Jika Anda menggunakan versi 4 bagian yang khas, Anda bisa menggunakan kelas System.Version, yang mencakup metode untuk membandingkan versi dan mengurai string versi
psousa
1
Apa jenis x dan y?
Gleno
5
Setiap kali seseorang berkata "Jangan gunakan X, Yatau Z", itu selalu membuat saya bertanya-tanya mengapa. Mengapa Anda tidak ingin menggunakan splitfungsi ini? The splitFungsi tampaknya seperti cara yang baik untuk melakukan hal ini jika Anda tidak akan menggunakan System.Versionkelas.
Ini memiliki antarmuka IComparable. Ketahuilah bahwa ini tidak akan berfungsi dengan string versi 5-bagian seperti yang Anda tunjukkan (apakah itu benar-benar string versi Anda?). Dengan asumsi input Anda adalah string, inilah sampel yang berfungsi dengan string versi .NET 4-bagian normal:
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 hanya satu pengecualian ... lakukan saja dengan nilai-nilai ini v1 = 1.0001 dan v2 = 1.1. itu memberi saya sama.
Sankar M
8
Ya, string versi bukan string desimal, dan menambahkan nol ke bagian nomor versi tidak relevan. Dengan kata lain, "00001" sama dengan "1" di bagian ke-2 dari string versi.
JohnD
8
Anda dapat membandingkan lebih mudah dibaca Version.Parse(v1) < Version.Parse(v2), karena operator >(Version v1, Version v2)diterapkan.
Andrey Moiseev
Ketahuilah bahwa Version.Parse ("6.0.0") kurang dari (<) Version.Parse ("6.0.0.0") (yaitu TIDAK sama). Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
adospace
13
Jika Anda dapat hidup dengan skema major.minor.build.revision Anda bisa menggunakan kelas Versi .Net . Kalau tidak, Anda harus menerapkan semacam parsing dari kiri ke kanan dan melanjutkan sampai Anda memiliki perbedaan atau kembali bahwa dua versi sama.
Selain jawaban @JohnD mungkin ada kebutuhan untuk membandingkan hanya nomor versi parsial tanpa menggunakan Split ('.') Atau string lain <-> gembung konversi int. Saya baru saja menulis metode ekstensi CompareTo dengan 1 argumen tambahan - jumlah bagian signifikan dari nomor versi untuk membandingkan (antara 1 dan 4).
Berhati-hatilah karena ini akan mengembalikan nilai yang sama untukcompareVersion("1.3", "1.3.1")
Ozgur Ozcitak
1
Jika karena alasan tertentu Anda tidak diizinkan untuk menggunakan metode perbandingan Versi secara langsung (misalnya dalam skenario client-server), pendekatan lain adalah mengekstraksi angka panjang dari versi dan kemudian membandingkan angka satu sama lain. Namun, nomor tersebut harus memiliki format berikut: Dua digit untuk Major, Minor dan Revisi dan empat digit untuk Build.
Cara mengekstrak nomor versi:
var version =Assembly.GetExecutingAssembly().GetName().Version;long newVersion = version.Major*1000000000L+
version.Minor*1000000L+
version.Build*1000L+
version.Revision;
Dan kemudian di tempat lain Anda bisa membandingkan:
if(newVersion > installedVersion){//update code}
Catatan: versi terinstal adalah nomor lama yang sebelumnya diekstraksi
X
,Y
atauZ
", itu selalu membuat saya bertanya-tanya mengapa. Mengapa Anda tidak ingin menggunakansplit
fungsi ini? Thesplit
Fungsi tampaknya seperti cara yang baik untuk melakukan hal ini jika Anda tidak akan menggunakanSystem.Version
kelas.Jawaban:
Bisakah Anda menggunakan kelas Versi?
http://msdn.microsoft.com/en-us/library/system.version.aspx
Ini memiliki antarmuka IComparable. Ketahuilah bahwa ini tidak akan berfungsi dengan string versi 5-bagian seperti yang Anda tunjukkan (apakah itu benar-benar string versi Anda?). Dengan asumsi input Anda adalah string, inilah sampel yang berfungsi dengan string versi .NET 4-bagian normal:
sumber
Version.Parse(v1) < Version.Parse(v2)
, karenaoperator >(Version v1, Version v2)
diterapkan.Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
Jika Anda dapat hidup dengan skema major.minor.build.revision Anda bisa menggunakan kelas Versi .Net . Kalau tidak, Anda harus menerapkan semacam parsing dari kiri ke kanan dan melanjutkan sampai Anda memiliki perbedaan atau kembali bahwa dua versi sama.
sumber
Selain jawaban @JohnD mungkin ada kebutuhan untuk membandingkan hanya nomor versi parsial tanpa menggunakan Split ('.') Atau string lain <-> gembung konversi int. Saya baru saja menulis metode ekstensi CompareTo dengan 1 argumen tambahan - jumlah bagian signifikan dari nomor versi untuk membandingkan (antara 1 dan 4).
sumber
sumber
compareVersion("1.3", "1.3.1")
Jika karena alasan tertentu Anda tidak diizinkan untuk menggunakan metode perbandingan Versi secara langsung (misalnya dalam skenario client-server), pendekatan lain adalah mengekstraksi angka panjang dari versi dan kemudian membandingkan angka satu sama lain. Namun, nomor tersebut harus memiliki format berikut: Dua digit untuk Major, Minor dan Revisi dan empat digit untuk Build.
Cara mengekstrak nomor versi:
Dan kemudian di tempat lain Anda bisa membandingkan:
Catatan: versi terinstal adalah nomor lama yang sebelumnya diekstraksi
sumber