Help us understand the problem. What is going on with this article?

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

やりたいこと

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

コード

自前実装

/// <summary>ドット区切り数字列を比較する</summary>
public static int CompareVersionString (this string a, string b) {
    var aSeries = a.Split ('.');
    var bSeries = b.Split ('.');
    int aNum, bNum;
    for (var i = 0; i < aSeries.Length; 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;
}

こっそりと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_*という記述はできません。

仕様

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

参考

  • Unityのインスペクタで設定される"Version*"文字列(Application.version)をマスタデータとして扱いたかったので、こういうやり方をしています。
  • 通常は、素直にVersionクラスを使うことをお勧めします。
    • public static readonly Version BundleVersion = new Version (Application.version);
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away