LoginSignup
1
6

More than 1 year has passed since last update.

バージョン番号(string)の比較 (C#)

Last updated at Posted at 2019-07-08

やりたいこと

  • バージョン番号のようなドット区切り十進表記の文字列を比較したい。
  • 一括比較したいだけなので、System.Versionクラスを使ってまではやりたくない。

コード

自前実装

/// <summary>ドット区切り数字列を比較する</summary>
/// <param name="a">対象文字列A</param>
/// <param name="b">対象文字列B</param>
/// <param name="number">比較する列数 (0なら全て)</param>
/// <returns>A-Bの符号 (1, 0, -1)</returns>
public static int CompareVersionString (this string a, string b, int number = 0) {
    var aSeries = a.Split ('.');
    var bSeries = b.Split ('.');
    int aNum, bNum;
    number = (number > 0) ? Mathf.Min (number, aSeries.Length) : aSeries.Length;
    for (var i = 0; i < number; i++) {
        if (i >= bSeries.Length) { return 1; }
        aNum = 0; int.TryParse (aSeries [i], out aNum);
        bNum = 0; int.TryParse (bSeries [i], out bNum);
        if (aNum > bNum) { return 1; } else if (aNum < bNum) { return -1; }
    }
    return (aSeries.Length == bSeries.Length) ? 0 : -1;
}
  • Unity以外では、MathfでなくMathを使用してください。

蛇足

こっそりとSystem.Versionを使う実装

/// <summary>ドット区切り数字列を比較する</summary>
public static int CompareVersionString (this string a, string b) {
    return (new System.Version (a)).CompareTo (new System.Version (b));
}
  • 比較のためにだけVersionクラスを使います。(本末転倒)
  • using system;を書かない辺りが「こっそり」です。

使用例

#if UNITY_*
Debug.Log ("1.1.12".CompareVersionString ("1.1.12.0"));
#else
Console.WriteLine ("1.1.12".CompareVersionString ("1.1.12.0"));
#endif
// -1
  • 実際にはUNITY_*という記述はできません。
Debug.Log ("1.1.12".CompareVersionString ("1.1.12.0", 3));
// 0
  • 比較する列数を指定することができます。

仕様

  • 以下の説明では、ドットで区切られた個々の数字列を"位"と称します。
    • 一般に、"メジャー"、"マイナー"、"ビルド"、"リビジョン"などと呼ばれるもののことです。
  • 各"位"を数値化するルールは、int.TryParse () に準じます。
    • 数値化できなかった場合は0と見なします。
  • 双方の文字列の左端は、同じ大きさの"位"であるものと見なし、右に行くほど段階的に小さくなるものとします。
    • 「左端は必ず"メジャー"で、次は"マイナー"である」ということです。
  • "位"が存在しない場合は、0よりも"小さい"値と見なします。(上記の使用例を参照)
  • 比較の結果を、(a < b) => -1(a == b) => 0(a > b) => 1で返します。

参考

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6