这就是我比较 version
的方式var _vA = new Version("0.9.9.1.1");
var _vB = new Version("0.9.9.1.2");
return (_vA.CompareTo(_vB) <= 0);
它引发异常:
版本字符串部分太短或太长。
我该如何解决?
答案 0 :(得分:1)
该版本通常允许2到4个组件。在您的示例中,您具有更多组件。要解决此问题,您将需要删除Version的组件。例如,
0.9.9.1
0.9.9.2
您可以阅读有关版本here
的更多信息典型版本组件是
主要:具有相同名称但主要版本不同的装配体 不可互换。较高的版本号可能表示主要 重写不能假定向后兼容的产品。
次要:如果两个程序集上的名称和主要版本号是 相同,但次要版本号不同,这表明 显着增强,以实现向后兼容。 较高的次要版本号可能表示对 产品或产品的完全向后兼容的新版本。
内部版本:内部版本号不同表示重新编译 相同的来源。当处理器, 平台或编译器更改。
修订:具有相同名称,主要和次要版本的程序集 数字,但不同的修订旨在充分体现 可互换的。版本号可能更高 可以修复以前发布的部件中的安全漏洞。
答案 1 :(得分:1)
如果两个版本均保证格式为
A.B.C ... .X.Y.Z
其中所有版本的部分(A
,B
,...,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