2011-09-27 45 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; 
    } 
}