比较版本返回太长或太短异常

时间:2019-04-05 08:47:20

标签: c# version

这就是我比较 version

的方式
var _vA = new Version("0.9.9.1.1");
var _vB = new Version("0.9.9.1.2");

return (_vA.CompareTo(_vB) <= 0);

引发异常

  

版本字符串部分太短或太长。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

该版本通常允许2到4个组件。在您的示例中,您具有更多组件。要解决此问题,您将需要删除Version的组件。例如,

0.9.9.1
0.9.9.2

您可以阅读有关版本here

的更多信息

典型版本组件是

  

主要:具有相同名称但主要版本不同的装配体   不可互换。较高的版本号可能表示主要   重写不能假定向后兼容的产品。

     

次要:如果两个程序集上的名称和主要版本号是   相同,但次要版本号不同,这表明   显着增强,以实现向后兼容。   较高的次要版本号可能表示对   产品或产品的完全向后兼容的新版本。

     

内部版本:内部版本号不同表示重新编译   相同的来源。当处理器,   平台或编译器更改。

     

修订:具有相同名称,主要和次要版本的程序集   数字,但不同的修订旨在充分体现   可互换的。版本号可能更高   可以修复以前发布的部件中的安全漏洞。

答案 1 :(得分:1)

如果两个版本均保证格式为

A.B.C ... .X.Y.Z

其中所有版本的部分(AB,...,Z)只能包含数字 0..9(我们可以借助正则表达式-bool isValid = Regex.IsMatch(version, @"^[0-9]+(\.[0-9]+)*$");)进行检查,我们可以将它们比较为

private static string[] VersionToArray(string version) {
  string[] result = version
    .Split('.')
    .Select(item => item.TrimStart('0'))
    .ToArray();

  // If we want to remove trailing zeros, i.e. 1.0.0.0.0.0 == 1.0.0.0 == 1.0:
  result = result
    .Reverse()
    .SkipWhile(item => item.All(c => c == '0'))
    .Reverse()
    .ToArray();

  return result;
}

private static int CompareVersions(string left, string right) {
  string[] leftArray = VersionToArray(left);
  string[] rightArray = VersionToArray(right);

  for (int i = 0; i < Math.Min(leftArray.Length, rightArray.Length); ++i) {
    int result = leftArray[i].Length.CompareTo(rightArray[i].Length);

    if (result == 0)
      result = string.Compare(leftArray[i], rightArray[i]);

    if (result != 0)
      return result;
  }

  return leftArray.Length.CompareTo(rightArray.Length);
}

演示:

Tuple<string, string>[] tests = new Tuple<string, string>[] {
  Tuple.Create("0.9.9.1.2", "0.9.9.1.1"),
  Tuple.Create("0.9.9.1.1", "0.9.9.1.2"),
  Tuple.Create("0.9.9.1.1", "0.9.9.1.1"),
  Tuple.Create("0", "1"),
  Tuple.Create("0", "0.0.0.0"),
  Tuple.Create("0.0.1.0", "0.0.0.1"),
  Tuple.Create("1.0", "1.0.0"),
  Tuple.Create("1.10", "1.1"),
  Tuple.Create("1.1", "1.01"),
  Tuple.Create("10.0", "9.0"),
  Tuple.Create("012345678901234567890.1", "012345678901234567890.1"),
};

string demo = string.Join(Environment.NewLine, tests
  .Select(test => new {
     v1 = test.Item1,
     v2 = test.Item2,
     comp = CompareVersions(test.Item1, test.Item2)
   })
   .Select(rec => 
      $"{rec.v1,25} {(rec.comp == 0 ? "=" : rec.comp < 0 ? "<" : ">")} {rec.v2}"));

Console.Write(demo);

结果:

                0.9.9.1.2 > 0.9.9.1.1
                0.9.9.1.1 < 0.9.9.1.2
                0.9.9.1.1 = 0.9.9.1.1
                        0 < 1
                        0 = 0.0.0.0
                  0.0.1.0 > 0.0.0.1
                      1.0 = 1.0.0
                     1.10 > 1.1
                      1.1 = 1.01
                     10.0 > 9.0
  012345678901234567890.1 = 012345678901234567890.1

编辑:如果我们想返回{{1},如果bool(即source >= target至少是 {{1} }),请参阅下面的评论,我们可以放

source