C# 你如何比较版本?

C# 你如何比较版本?,c#,semantic-versioning,C#,Semantic Versioning,如何比较两个版本号 我不想要简单的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”。然后从左到右比较各个部分。

如何比较两个版本号

我不想要简单的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”。然后从左到右比较各个部分。如果零件包含特殊版本字符串,则按以下顺序处理:此列表中未找到的任何字符串 如何做到这一点

或者默认情况下是否存在类似的情况?

使用

要安装软件包,请执行以下操作:

 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
更新:


另一种方法是使用yadyn的语义版本

您可以单击以复制代码


您还可以从有100多个贡献者的数据库中复制代码。

与其使用第三方的库,不如只引用Nuget.Core并利用它们的语义版本。此类的工作方式与.net中的标准版本对象非常相似,但遵循语义版本控制规范()。它将把你的字符串解析成一个IComparable和IEquatable对象,这样你就可以比较多个版本,或者在一个集合中对它们进行排序,等等

Core:(你可以通过Nuget拉取这个库)


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

静态整数比较(字符串第一,字符串第二)
{
var IntVersions=新列表
{
Array.ConvertAll(First.Split('.')、int.Parse),
Array.ConvertAll(Second.Split('.')、int.Parse)
};
var Cmp=IntVersions.First().Length.CompareTo(IntVersions.Last().Length);
如果(Cmp==0)
IntVersions=IntVersions.Select(v=>{Array.Resize(ref v,IntVersions.Min(x=>x.Length));返回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();
返回CmpVersions.First().Equals(CmpVersions.Last())?Cmp:CmpVersions.First().Equals(StrVersions.First())?1:-1;
}
第一>第二 1. 第一=第二 0 第一次<第二次 -1
据我所知,在C#中没有内置的功能来做这类事情。您的用例是否允许您将版本表示为自定义类型?可以使用
版本
类型,但您仍必须自己处理后缀:@Mahmoud“自定义类型”是什么意思?如果内置
版本
类型不符合您的需要,请参阅@blins注释。我的意思是,创建一个自定义类
Version
来表示该版本。但首先,看看这个内置类,我不知道它存在于
.Net
使用标准版本语义啊,是的,这可能会起作用,我只需要做一些拆分,就可以了!谢谢
     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
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();
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;
}