创建一个自定义排序方法,使用C#对版本号进行排序



我有一个列表版本Numbers=

v1.6.4
v2.1.19
v2.1.20
v2.10.00
v2.2.00
v2.2.01
v2.3.00
v2.4.00
v2.6.00
v2.4.01

2.9.00之后,版本应该是3.0.xx。但我有2.10.00和转发。

我尝试了System Sort((方法和使用Version.parse((方法的Orderby。但他们给了我错误的输出:

v1.6.4
v2.1.19
v2.1.20
v2.10.00
v2.2.00
v2.2.01
v2.3.00
v2.4.00
v2.4.01

我预计最终会有2.10.00,依此类推。在C#和linq中对这样的版本号进行排序的最佳方法是什么?

使用List<Version>,然后可以简单地使用list.Sort()。要从字符串中获取版本,请使用Version.Parse。由于前面有一个v,您需要将其移除:

List<string> versionStringList = new() {
"v1.6.4",
"v2.1.19",
"v2.1.20",
"v2.10.00",
"v2.2.00",
"v2.2.01",
"v2.3.00",
"v2.4.00",
"v2.6.00",
"v2.4.01"
};
List<Version> versionList = versionStringList
.Select(s => Version.Parse(s.TrimStart('v', 'V')))
.ToList();
versionList.Sort();

调试器中的结果:

-       versionList Count = 10  System.Collections.Generic.List<System.Version>
+       [0] {1.6.4}  System.Version
+       [1] {2.1.19} System.Version
+       [2] {2.1.20} System.Version
+       [3] {2.2.0}  System.Version
+       [4] {2.2.1}  System.Version
+       [5] {2.3.0}  System.Version
+       [6] {2.4.0}  System.Version
+       [7] {2.4.1}  System.Version
+       [8] {2.6.0}  System.Version
+       [9] {2.10.0} System.Version

如果您也不知道如何在之后将Version转换为格式化字符串,其中内部版本号总是至少有两位数字,则可以使用以下方法:

private static string VersionToString(Version v)
=> $"v{v.Major}.{v.Minor}.{v.Build.ToString("D2")}";

versionStringList = versionList.Select(VersionToString).ToList();

最新更新