如何比较版本号?
例如:
x = 1.23.56.1487.5
y = 1.24.55.487.2
答案 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());
}