繁体   English   中英

使用字符和数字对列表<>进行排序

[英]Sort List<> with chars and numbers

我正在为我公司开发的程序开发一个Update-Tool。 要更新程序,我需要执行一些SQL脚本。 这些脚本必须具有正确的顺序(当然)。 我有一个清单。 SqlScriptModel有一个'Name'属性,我用它来排序列表。 SQL-Scripts-Name以Programm-Version开头(例如:5.8.1.0)。 目前,我的“排序”列表如下所示:

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脚本之后执行。

我的代码看起来像这样:

SqlScriptList.Sort((x, y) => string.Compare(x.Name, y.Name));

有人已经有同样的问题吗? 或者有一个有效解决方案的链接? 我会非常感激的!

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

5.8.0.01 - Update Script
5.8.0.02 - Update Script
5.8.0.10 - Update Script
5.8.0.11 - Update Script

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

string version = "5.8.0.10";
int fullVersionNumber =
    version
        .Split(new char[] { '.' })
        .Select(int.Parse)
        .Aggregate((first, second) => first * 100 + second);
// fullVersionNumber = 5080010

你可以用这个来创造一个功能:

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;
}

并像这样使用它:

SqlScriptList.Sort(
    (x, y) => GetNumericVersion(x.Name).CompareTo(GetNumericVersion(y.Name)));

考虑使用.Net框架中的Version类,它有一个合适的比较运算符。

示例代码:

        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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM