这是我的。我需要比较一些古怪的版本字符串,比如“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());
}