比较版本号而不使用拆分功能

时间:2011-09-27 11:11:09

标签: c# string compare version versioning

如何比较版本号?

例如:

x = 1.23.56.1487.5

y = 1.24.55.487.2

6 个答案:

答案 0 :(得分:256)

您可以使用Version类吗?

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;

    }
}

答案 1 :(得分:12)

如果您可以使用major.minor.build.revision方案,则可以使用.Net Version类。否则你必须从左到右实现某种解析,直到你有差异或返回两个版本是相同的。

答案 2 :(得分:7)

除了@JohnD的回答之外,可能还需要比较部分版本号而不使用Split('。')或其他字符串&lt; - &gt; int转换膨胀。我刚刚编写了一个扩展方法CompareTo,附加了一个参数 - 要比较的版本号的重要部分数(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; 
    }
}

答案 3 :(得分: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;
    }

答案 4 :(得分:1)

如果由于某种原因而不允许您直接使用版本的比较方法(例如,在客户端-服务器方案中),则另一种方法是从版本中提取一个长数字,然后将这些数字相互比较。 但是,该数字必须采用以下格式:“主要”,“次要”和“修订”分别为两位数和“内部版本”为四位。

如何提取版本号:

var version = Assembly.GetExecutingAssembly().GetName().Version;

long newVersion = version.Major * 1000000000L + 
                   version.Minor * 1000000L + 
                   version.Build * 1000L + 
                   version.Revision;

然后可以在其他地方进行比较:

if(newVersion > installedVersion)
{
  //update code
}

注意:installedVersion是以前提取的长号

答案 5 :(得分:1)

这是我的。我需要比较一些古怪的版本字符串,比如“3.2.1.7650.b40”和“3.10.1”,所以我不能像上面建议的那样使用 VersionInfo 对象。 这是快速而肮脏的,所以我很喜欢风格。我也提供了一个简短的函数来测试它。

    /// <summary>
    /// Compare two version strings, e.g.  "3.2.1.0.b40" and "3.10.1.a".
    /// V1 and V2 can have different number of components.
    /// Components must be delimited by dot.
    /// </summary>
    /// <remarks>
    /// This doesn't do any null/empty checks so please don't pass dumb parameters
    /// </remarks>
    /// <param name="v1"></param>
    /// <param name="v2"></param>
    /// <returns>
    /// -1 if v1 is lower version number than v2,
    /// 0 if v1 == v2,
    /// 1 if v1 is higher version number than v2,
    /// -1000 if we couldn't figure it out (something went wrong)
    /// </returns>
    private static int CompareVersionStrings(string v1, string v2)
    {
        int rc = -1000;

        v1 = v1.ToLower();
        v2 = v2.ToLower();
        
        if (v1 == v2)
            return 0;

        string[] v1parts = v1.Split('.');
        string[] v2parts = v2.Split('.');

        for (int i = 0; i < v1parts.Length; i++)
        {
            if (v2parts.Length < i+1)
                break; // we're done here

            rc = String.Compare(v1parts[i], v2parts[i], StringComparison.Ordinal);
            if (rc != 0)
                break;
        }

        if (rc == 0)
        {
            // catch this scenario: v1="1.0.1" v2="1.0"
            if (v1parts.Length > v2parts.Length)
                rc = 1; // v1 is higher version than v2
            // catch this scenario: v1="1.0" v2="1.0.1"
            else if (v2parts.Length > v1parts.Length)
                rc = -1; // v1 is lower version than v2
        }

        if (rc == 0 || rc == -1000)
            return rc;
        else
            return rc < 0 ? -1 : 1;
    }

    // for debugging
    private static void Test_CompareVersionStrings()
    {
        bool allPass = true;

        // should be equal
        allPass &= (0 == CompareVersionStrings("1", "1"));
        allPass &= (0 == CompareVersionStrings("1.1", "1.1"));
        allPass &= (0 == CompareVersionStrings("3.3.a20", "3.3.A20"));

        // v1 should be lower
        allPass &= (-1 == CompareVersionStrings("1", "2"));
        allPass &= (-1 == CompareVersionStrings("1.0", "1.0.1"));
        allPass &= (-1 == CompareVersionStrings("1.0", "1.1"));
        allPass &= (-1 == CompareVersionStrings("1.0.0.3", "1.1"));
        allPass &= (-1 == CompareVersionStrings("1.2.3.4", "1.2.3.4b"));
        allPass &= (-1 == CompareVersionStrings("1.2.3.4", "1.2.3.4.b"));

        // v1 should be higher
        allPass &= (1 == CompareVersionStrings("2", "1"));
        allPass &= (1 == CompareVersionStrings("1.0.1", "1.0"));
        allPass &= (1 == CompareVersionStrings("1.1", "1.0"));
        allPass &= (1 == CompareVersionStrings("1.1", "1.0.0.3"));
        allPass &= (1 == CompareVersionStrings("1.2.3.4b", "1.2.3.4"));
        allPass &= (1 == CompareVersionStrings("1.2.3.4.b", "1.2.3.4"));

        System.Diagnostics.Debug.WriteLine("AllPass = " + allPass.ToString());
    }
相关问题