2015-10-12 43 views
3

我正在开发一个我公司开发的程序的更新工具。要更新程序,我需要执行一些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)); 

已经有人已经有同样的问题?或有链接到有效的解决方案?我会非常感谢!

+0

http://stackoverflow.com/questions/2217029/sort-string-list-with-numeric-values –

+0

你可以的PInvoke StrCmpLogicalW:https://msdn.microsoft。 com/library/windows/desktop/bb759947(v = vs.85).aspx – Henrik

回答

2

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

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

工作完美,谢谢! – Helvetios

2

考虑使用.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)); 
相关问题