2011-09-27 19 views
81

Sürüm numaralarını nasıl karşılaştırabilirim? ÖrneğinAyraç işlevini kullanmadan sürüm numaralarını karşılaştırın

:

x = 1.23.56.1487.5

1.24.55.487.2

+4

Sonucun ne olmasını istersiniz? – BoltClock

+3

5 parçalı bir versiyon? Tipik 4 bölüm sürümünü kullanıyorsanız, sürümleri karşılaştırmak ve – psousa

+1

sürüm dizesini ayrıştırmak için yöntemler içeren System.Version sınıfını kullanabilirsiniz. X ve y türleri nelerdir? – Gleno

cevap

193

Version sınıfını kullanabilir miyim = y?

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

Bir ıcomparable arayüze sahiptir. Bunun, göstermiş olduğunuz 5 parçalı bir sürüm dizesiyle çalışmayacağını unutmayın (bu gerçekten sürüm dizginiz mi?). Varsayarsak senin girişler burada normal bir .NET 4 bölümlük sürüm dizesiyle bir çalışma örneği var, görürsün:

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; 

    } 
} 
+3

Sadece sürüm 2-4 parçadan oluşursa – username

+0

@dev_Boston sadece bir istisnadır ... sadece bu değerler ile yapın v1 = 1.0001 ve v2 = 1.1 .it bana eşit verir. –

+7

Evet, sürüm dizeleri ondalık olmayan dizeler değil ve sıfırların sürüm numarasının bir bölümüne eklenmesi alakasız. Diğer bir deyişle, "00001", sürüm dizesinin 2. bölümünde "1" e eşittir. – JohnD

8

Eğer Ana.Alt.Yapı.Düzeltme düzeni ile yaşayabilir Eğer .Net Version sınıfını kullanabilirsiniz . Aksi takdirde, soldan sağa doğru bir şekilde ayrıştırma gerçekleştirmeniz ve iki versiyonun eşit olduğu bir fark veya geri dönüşe kadar devam etmeniz gerekir. > Int dönüşüm kabartmak -

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; 
    } 
+5

Bunun 'compareVersion ("1.3", "1.3.1") için eşitlik getirdiğini unutmayın –

0

@JohnD ek olarak '(.') Ya da diğer dize < s cevabı bir Böl kullanmadan sadece kısmi sürüm numaraları karşılaştırmak gereğini olabilir'. Ben sadece 1 ek argüman ile CompareTo bir uzantısı yöntemi yazdım - karşılaştırmak için sürüm numarası önemli parçaların sayısı (1 ve 4 arasında).

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; 
    } 
} 
İlgili konular