2011-09-27 40 views
81

如何比較版本號?比較不使用分割功能的版本號

例如:

X = 1.23.56.1487.5

Y = 1.24.55.487.2

+4

你想要結果是什麼? – BoltClock

+3

帶5個部件的版本?如果您使用的是典型的4部分版本,則可以使用System.Version類,其中包括用於比較版本和解析版本字符串的方法。 – psousa

+1

x和y的類型是什麼? – Gleno

回答

193

你可以使用版本類?

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

它有一個IComparable接口。請注意,這不適用於你已經顯示的5部分版本字符串(這真的是你的版本字符串?)。假設你的投入是字符串,這裏是與正常.NET 4部分組成的版本字符串工作示例:

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

只有當版本由2-4個部分組成時 – username

+0

@dev_Boston只有一個例外......只是用這些值來做v1 = 1.0001和v2 = 1.1。 –

+7

是的,版本字符串不是十進制字符串,並且向版本號的一部分預先加零爲無關緊要。換句話說,版本字符串的第二部分中的「00001」等於「1」。 – JohnD

8

如果你可以用major.minor.build.revision計劃生活,你可以使用.NET Version類。否則,你將不得不從左到右執行某種解析,直到你有區別或者返回兩個版本是平等的。

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

請注意,這將返回等於'compareVersion(「1.3」,「1.3.1」)' –

0

除了@JohnD的答案可能有必要在不使用拆分僅比較偏的版本號('')或其他字符串< - > INT轉換膨脹。我剛剛寫了一個擴展方法CompareTo與1個附加參數 - 要比較的版本號的重要部分的數量(1和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; 
    } 
}