分割機能を使用せずにバージョン番号を比較する


124

バージョン番号を比較するにはどうすればよいですか?

例えば:

x = 1.23.56.1487.5

y = 1.24.55.487.2


4
結果をどうしたいですか?
BoltClock

4
5パーツのバージョン?あなたは典型的な4パートのバージョンを使用していた場合は、バージョンを比較し、バージョン文字列を解析するためのメソッドが含まれてSystem.Versionクラスを、使用することができます
psousa

1
xとyのタイプは何ですか?
グレノ2011

5
誰かが「使用しないXYまたはZ」と言うときはいつでも、なぜ私はいつも不思議に思います。なぜこのsplit機能を使いたくないのですか?split機能は、使用する予定がない場合は、これを行うには良い方法のように思えるSystem.Versionクラスを。
Bob2Chiv 2011

回答:


294

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;

    }
}

5
バージョンが2〜4の部分で構成されている場合のみ
ユーザー名

@dev_Bostonは1つの例外のみです...これらの値v1 = 1.0001とv2 = 1.1を使用してください。
Sankar M 2011

8
はい、バージョン文字列は10進文字列ではなく、バージョン番号の一部にゼロを付加することは関係ありません。つまり、バージョン文字列の2番目の部分の「00001」は「1」と同じです。
JohnD 2011

8
が実装されているVersion.Parse(v1) < Version.Parse(v2)ため、として読みやすく比較できoperator >(Version v1, Version v2)ます。
Andrey Moiseev

Version.Parse( "6.0.0")は(<)Version.Parse( "6.0.0.0")よりも小さい(等しくない)ことに注意してください。Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
adospace 2018年

13

major.minor.build.revisionスキームを使用できる場合は、.Net Versionクラスを使用できます。それ以外の場合は、何らかの解析を左から右に実装し、違いがあるか、2つのバージョンが等しいと返すまで続ける必要があります。


7

@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; 
    }
}

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;
    }

14
これは次と等しい値を返すことに注意してくださいcompareVersion("1.3", "1.3.1")
Ozgur Ozcitak '25

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は以前に抽出された長い数値です


すべての桁を3桁にするため、コードは実際には次のようになります。 "version.Major * 1000000000L + version.Minor * 1000000L + version.Build * 1000L + version.Revision"
Stef Heyenrath

1
@StefHeyenrath正解です。上記のコードを自由に調整してください。
Fabian Bigler、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.