バージョン番号を比較するにはどうすればよいですか?
例えば:
x = 1.23.56.1487.5
y = 1.24.55.487.2
X
、Y
またはZ
」と言うときはいつでも、なぜ私はいつも不思議に思います。なぜこのsplit
機能を使いたくないのですか?split
機能は、使用する予定がない場合は、これを行うには良い方法のように思えるSystem.Version
クラスを。
バージョン番号を比較するにはどうすればよいですか?
例えば:
x = 1.23.56.1487.5
y = 1.24.55.487.2
X
、Y
またはZ
」と言うときはいつでも、なぜ私はいつも不思議に思います。なぜこのsplit
機能を使いたくないのですか?split
機能は、使用する予定がない場合は、これを行うには良い方法のように思えるSystem.Version
クラスを。
回答:
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;
}
}
Version.Parse(v1) < Version.Parse(v2)
ため、として読みやすく比較できoperator >(Version v1, Version v2)
ます。
Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
@JohnDの回答に加えて、Split( '。')または他の文字列<-> int変換膨張を使用せずに、部分的なバージョン番号のみを比較する必要がある場合があります。拡張メソッドCompareToを1つの追加の引数-比較するバージョン番号の重要な部分の数(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;
}
}
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;
}
compareVersion("1.3", "1.3.1")
何らかの理由でバージョンの比較方法を直接使用することが許可されていない場合(クライアントサーバーシナリオなど)、別のアプローチは、バージョンから長い数値を抽出してから、数値を相互に比較することです。ただし、番号の形式は、メジャー、マイナー、リビジョンの2桁とビルドの4桁である必要があります。
バージョン番号を抽出する方法:
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は以前に抽出された長い数値です