1

マルチパート英数字文字列の比較をしたい。

現在システムで実行されている sw バージョンを含む文字列を受け取りました。

システムが特定の sw バージョン以降で実行されている場合にのみ、いくつかの操作を実行したいと考えています。

たとえば、システムが sw バージョン 3.D 以降 (3.E、..) を実行している場合、いくつかの操作を行います。システムがより低い SW バージョン (3.B、..) を実行している場合、私はそれを行いません。

4

1 に答える 1

6

を作成しますIComparer<string>。例:

class VersionComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        // omitted error checking for brevity
        var sa = a.Split('.');
        var majorA = sa[0];
        var minorA = sa[1];

        var sb = b.Split('.');
        var majorB = sb[0];
        var minorB = sb[1];

        if(majorA == majorB)
            return minorA.CompareTo(minorB);

        return majorA.CompareTo(majorB); // assuming a single letter of always the same case
    }
}

次のように使用します。

var comparer = new VersionComparer();
Debug.Assert(comparer.Compare("2.C", "2.D") < 0);  // 2.C is older
Debug.Assert(comparer.Compare("2.D", "2.D") == 0); // same
Debug.Assert(comparer.Compare("2.E", "2.D") > 0);  // 2.E is newer
Debug.Assert(comparer.Compare("3.C", "2.D") > 0);  // 3.C is newer
Debug.Assert(comparer.Compare("0.A", "0.B") < 0);  // 0.A is older

次のような適切なタイプでバージョン番号を保存する方がよいことに注意してください。

class Version
{
    public int Major {get; private set;}
    public string Minor {get; private set;}

    public Version(string s)
    {
        // omitted error checking for brevity
        // assuming a single letter of always the same case
        var sa = s.Split('.');
        Major = int.Parse(sa[0]);
        Minor = sa[1];
    }

    public static bool operator <(Version one, Version another)
    {
        if (one.Major == another.Major)
            return one.Minor.CompareTo(another.Minor) < 0;
        return one.Major< another.Major;
    }

    public static bool operator >(Version one, Version another)
    {
        return !(one < another);
    }

    public static bool operator ==(Version one, Version another)
    {
        return one.Major == another.Major && one.Minor == another.Minor;
    }

    public static bool operator !=(Version one, Version another)
    {
        return !(one == another);
    }

    public static bool operator >=(Version one, Version another)
    {
        return (one > another || one == another);
    }

    public static bool operator <=(Version one, Version another)
    {
        return (one < another || one == another);
    }
}

そして簡単なチェック:

Debug.Assert(new Version("2.C")  < new Version("2.D"));
Debug.Assert(new Version("2.D")  > new Version("2.C"));
Debug.Assert(new Version("4.C")  > new Version("2.D"));
Debug.Assert(new Version("4.C")  == new Version("4.C"));
Debug.Assert(new Version("4.C")  >= new Version("2.D"));
于 2013-09-06T14:12:18.487 に答える