首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用字符和数字对List<>排序

用字符和数字对List<>排序
EN

Stack Overflow用户
提问于 2015-10-12 12:27:15
回答 2查看 209关注 0票数 3

我正在为我的公司开发的一个程序开发一个更新工具。要更新程序,我需要执行一些SQL-脚本。这些脚本必须有正确的顺序(当然)。我有一份名单。SqlScriptModel有一个'Name‘属性,我用来对列表进行排序。从Programm版本开始(例如: 5.8.1.0)。目前,我的“排序”列表如下:

代码语言:javascript
复制
5.8.0.1 - Update Script
5.8.0.10 - Update Script
5.8.0.11 - Update Script
5.8.0.2 - Update Script

当然,5.8.0.10脚本需要在5.8.0.2脚本之后执行。

我的代码如下所示:

代码语言:javascript
复制
SqlScriptList.Sort((x, y) => string.Compare(x.Name, y.Name));

有人也有同样的问题吗?还是有一个指向有效解决方案的链接?我会非常感激的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-12 12:32:23

只需重命名您的文件,使所有版本子字符串都具有相同的长度。使用以下零填充版本的最后一部分:

代码语言:javascript
复制
5.8.0.01 - Update Script
5.8.0.02 - Update Script
5.8.0.10 - Update Script
5.8.0.11 - Update Script

如果不想这样做,可以在代码中将版本字符串转换为数字,然后根据该数字进行排序:

代码语言:javascript
复制
string version = "5.8.0.10";
int fullVersionNumber =
    version
        .Split(new char[] { '.' })
        .Select(int.Parse)
        .Aggregate((first, second) => first * 100 + second);
// fullVersionNumber = 5080010

您可以利用此功能进行如下操作:

代码语言:javascript
复制
public static int GetNumericVersion(string fileName)
{
    string version = fileName.Split(new char[] { ' ' })[0];
    int fullVersionNumber =
        version
            .Split(new char[] { '.' })
            .Select(int.Parse)
            .Aggregate((first, second) => first * 100 + second);

    return fullVersionNumber;
}

像这样使用它:

代码语言:javascript
复制
SqlScriptList.Sort(
    (x, y) => GetNumericVersion(x.Name).CompareTo(GetNumericVersion(y.Name)));
票数 2
EN

Stack Overflow用户

发布于 2015-10-12 12:55:07

考虑使用来自版本框架的.Net类,它有一个合适的比较操作符。

样本代码:

代码语言:javascript
复制
        List<Version> versions = new List<Version>();
        List<string> versionStrings;

        // get somehow, the list of version strings in "Version format" - nothing else except x.y.z.k
        versionStrings = new List<string>(
            new string[]{ "5.8.0.1",
                "5.8.0.10",
                "5.8.0.11",
                "5.8.0.2" }
            );

        // pupulate list of Version from list of string
        versionStrings.ForEach(str => versions.Add(new Version(str)));

        //list is not orderded
        versions.ForEach(ver => System.Diagnostics.Debug.WriteLine(ver));
        // sort the list using the default Version comparison
        versions.Sort();
        // list is ordered
        versions.ForEach(ver => System.Diagnostics.Debug.WriteLine(ver));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33081135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档