public static void Main()
Test_CompareVersionStrings();
private static int CompareVersionStrings(string v1, string v2)
string[] v1parts = v1.Split('.');
string[] v2parts = v2.Split('.');
for (int i = 0; i < v1parts.Length; i++)
if (v2parts.Length < i+1)
string v1Token = v1parts[i];
string v2Token = v2parts[i];
bool v1Numeric = int.TryParse(v1Token, out x);
bool v2Numeric = int.TryParse(v2Token, out x);
if (v1Numeric && v2Numeric) {
while (v1Token.Length < v2Token.Length)
while (v2Token.Length < v1Token.Length)
rc = String.Compare(v1Token, v2Token, StringComparison.Ordinal);
if (v1parts.Length > v2parts.Length)
else if (v2parts.Length > v1parts.Length)
if (rc == 0 || rc == -1000)
private static int _CompareVersionStrings(string v1, string v2)
int rc = CompareVersionStrings(v1, v2);
Console.WriteLine("Compare v1: " + v1 + " v2: " + v2 + " result: " + rc);
private static void Test_CompareVersionStrings()
allPass &= (0 == _CompareVersionStrings("1", "1"));
allPass &= (0 == _CompareVersionStrings("1.1", "1.1"));
allPass &= (0 == _CompareVersionStrings("3.3.a20", "3.3.A20"));
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"));
allPass &= (-1 == _CompareVersionStrings("1.8.0", "20.0.0.0"));
allPass &= (-1 == _CompareVersionStrings("5.6.0.788.2", "20.0.0.0"));
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"));
allPass &= (1 == _CompareVersionStrings("20.0.0.0", "5.6.0.788.2"));
Console.WriteLine("allPass = " + allPass.ToString());