C#如何比较版本?

时间:2018-03-17 14:44:54

标签: c#

如何比较两个版本号?

我不想要简单的1.0.0.0,但我正在寻找比较这些

1.0.0.1

1.0.0.1rc1 / 1.0.0.1-rc1

1.0.0.1b

1.0.0.1a / 1.0.0.1-a

等等

按照最新的方向订购。

引用PHP.net从他们想要的功能

  

version_compare()比较两个" PHP标准化的"版本号字符串。   该函数首先用点替换_, - 和+。在版本字符串中也插入点。在任何非数字之前和之后,例如' 4.3.2RC1'变成了4.3.2.RC.1'。然后它比较从左到右开始的部分。如果某个部分包含特殊版本字符串,则按以下顺序处理这些字符串:此列表中未找到的任何字符串< dev< alpha = a< beta = b< RC = rc< #< pl = p。这种方式不仅有不同级别的版本,如' 4.1'和' 4.1.2'可以比较任何包含开发状态的PHP特定版本。

如何做到这一点?

或者默认情况下是这样的吗?

4 个答案:

答案 0 :(得分:7)

使用semantic version library for .Net

安装包:

 Install-Package semver

您可以解析/比较版本。

示例1:比较

     var v1 = new SemVersion(1, 0, 0, "rc1");
     Console.WriteLine(v1);
     var v2 = new SemVersion(1, 0, 0, "rc2");
     Console.WriteLine(v2);
     var r = SemVersion.Compare(v1,v2);
     //If v1 < v2   return -1
     //if v1 > v2   return +1
     //if v1 = v2   return 0
     Console.WriteLine(r); // -1

示例2:解析

     var version = SemVersion.Parse("1.2.45-alpha-beta+nightly.23.43-bla");
    Console.WriteLine(version);
    Console.WriteLine( version.Major); //1
    Console.WriteLine( version.Minor); //2
    Console.WriteLine( version.Patch); //45
    Console.WriteLine(version.Prerelease); //alpha-beta
    Console.WriteLine(version.Build); //nightly.23.43

<强>更新

fiddle

中的生活演示

答案 1 :(得分:0)

另一种方法是使用yadyn的SemanticVersion

您可以单击here 复制代码。

您还可以从git tool复制贡献者超过100的代码。

答案 2 :(得分:0)

最好不要引用第三方的库,而只需引用 Nuget.Core 并利用其 SemanticVersion 类。此类的工作方式与.net中的标准Version对象非常相似,但遵循语义版本规范(https://semver.org)。它将字符串解析为IComparable和IEquatable对象,以便您可以比较多个版本或在集合中对它们进行排序等。

Nuget.Core:https://www.nuget.org/packages/nuget.core/(您可以通过nuget提取此库)

https://github.com/NuGet/NuGet2/blob/2.13/src/Core/SemanticVersion.cs

var rawVersions = new [] {"v1.4.0", "v1.4.0-patch10", "v1.4.0-patch2"};
var versions = rawVersions.Select(v => new SemanticVersion(v));
var sorted = versions.ToList().Sort();

答案 3 :(得分:0)

我比较两个版本的功能。版本示例“1.22.333.4444”

static int CompareVersions(string First, string Second)
{
    var IntVersions = new List<int[]>
    {
        Array.ConvertAll(First.Split('.'), int.Parse),
        Array.ConvertAll(Second.Split('.'), int.Parse)
    };
    var Cmp = IntVersions.First().Length.CompareTo(IntVersions.Last().Length);
    if (Cmp == 0)
        IntVersions = IntVersions.Select(v => { Array.Resize(ref v, IntVersions.Min(x => x.Length)); return v; }).ToList();
    var StrVersions = IntVersions.ConvertAll(v => string.Join("", Array.ConvertAll(v,
                        i => { return i.ToString($"D{IntVersions.Max(x => x.Max().ToString().Length)}"); })));
    var CmpVersions = StrVersions.OrderByDescending(i => i).ToList();
    return CmpVersions.First().Equals(CmpVersions.Last()) ? Cmp : CmpVersions.First().Equals(StrVersions.First()) ? 1 : -1;
}
<头>
第一 > 第二 1
第一 == 第二 0
第一<第二 -1