マルチパート英数字文字列の比較をしたい。
現在システムで実行されている sw バージョンを含む文字列を受け取りました。
システムが特定の sw バージョン以降で実行されている場合にのみ、いくつかの操作を実行したいと考えています。
たとえば、システムが sw バージョン 3.D 以降 (3.E、..) を実行している場合、いくつかの操作を行います。システムがより低い SW バージョン (3.B、..) を実行している場合、私はそれを行いません。
マルチパート英数字文字列の比較をしたい。
現在システムで実行されている sw バージョンを含む文字列を受け取りました。
システムが特定の sw バージョン以降で実行されている場合にのみ、いくつかの操作を実行したいと考えています。
たとえば、システムが sw バージョン 3.D 以降 (3.E、..) を実行している場合、いくつかの操作を行います。システムがより低い SW バージョン (3.B、..) を実行している場合、私はそれを行いません。
を作成します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"));