当前位置:  开发笔记 > 编程语言 > 正文

比较版本标识符

如何解决《比较版本标识符》经验,为你挑选了2个好方法。

这是我的代码,它采用"1,5,0,4"或"1.5.0.4"形式的两个版本标识符,并确定哪个是较新的版本.

请给我建议或改进!

    /// 
    /// Compares two specified version strings and returns an integer that 
    /// indicates their relationship to one another in the sort order.
    /// 
    /// the first version
    /// the second version
    /// less than zero if strA is less than strB, equal to zero if
    /// strA equals strB, and greater than zero if strA is greater than strB
    public static int CompareVersions(string strA, string strB)
    {
        char[] splitTokens = new char[] {'.', ','};
        string[] strAsplit = strA.Split(splitTokens, StringSplitOptions.RemoveEmptyEntries);
        string[] strBsplit = strB.Split(splitTokens, StringSplitOptions.RemoveEmptyEntries);
        int[] versionA = new int[4];
        int[] versionB = new int[4];

        for (int i = 0; i < 4; i++)
        {
            versionA[i] = Convert.ToInt32(strAsplit[i]);
            versionB[i] = Convert.ToInt32(strBsplit[i]);
        }

        // now that we have parsed the input strings, compare them
        return RecursiveCompareArrays(versionA, versionB, 0);
    }

    /// 
    /// Recursive function for comparing arrays, 0-index is highest priority
    /// 
    private static int RecursiveCompareArrays(int[] versionA, int[] versionB, int idx)
    {
        if (versionA[idx] < versionB[idx])
            return -1;
        else if (versionA[idx] > versionB[idx])
            return 1;
        else
        {
            Debug.Assert(versionA[idx] == versionB[idx]);
            if (idx == versionA.Length - 1)
                return 0;
            else
                return RecursiveCompareArrays(versionA, versionB, idx + 1);
        }
    }

@ Darren Kopp:

版本类不处理格式1.0.0.5的版本.



1> Darren Kopp..:

使用Version类.

Version a = new Version("1.0.0.0");
Version b = new Version("2.0.0.0");

Console.WriteLine(string.Format("Newer: {0}", (a > b) ? "a" : "b"));
// prints b



2> Antti Kissan..:

该System.Version类不支持在它逗号版本,因此所提出的解决方案达伦·柯普是不够的.

这是一个尽可能简单的版本(但并不简单).

它使用System.Version但通过在比较之前进行搜索替换来实现与"1,2,3,4"等版本号的兼容性.

    /// 
    /// Compare versions of form "1,2,3,4" or "1.2.3.4". Throws FormatException
    /// in case of invalid version.
    /// 
    /// the first version
    /// the second version
    /// less than zero if strA is less than strB, equal to zero if
    /// strA equals strB, and greater than zero if strA is greater than strB
    public static int CompareVersions(String strA, String strB)
    {
        Version vA = new Version(strA.Replace(",", "."));
        Version vB = new Version(strB.Replace(",", "."));

        return vA.CompareTo(vB);
    }

该代码已经过测试:

    static void Main(string[] args)
    {
        Test("1.0.0.0", "1.0.0.1", -1);
        Test("1.0.0.1", "1.0.0.0", 1);
        Test("1.0.0.0", "1.0.0.0", 0);
        Test("1, 0.0.0", "1.0.0.0", 0);
        Test("9, 5, 1, 44", "3.4.5.6", 1);
        Test("1, 5, 1, 44", "3.4.5.6", -1);
        Test("6,5,4,3", "6.5.4.3", 0);

        try
        {
            CompareVersions("2, 3, 4 - 4", "1,2,3,4");
            Console.WriteLine("Exception should have been thrown");
        }
        catch (FormatException e)
        {
            Console.WriteLine("Got exception as expected.");
        }

        Console.ReadLine();
    }

    private static void Test(string lhs, string rhs, int expected)
    {
        int result = CompareVersions(lhs, rhs);
        Console.WriteLine("Test(\"" + lhs + "\", \"" + rhs + "\", " + expected +
            (result.Equals(expected) ? " succeeded." : " failed."));
    }

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有