2015-10-12 2 views
3

Я работаю над Update-Tool для программы, разработанной моей компанией. Чтобы обновить программу, мне нужно выполнить некоторые SQL-скрипты. Эти сценарии должны иметь правильный порядок (конечно). У меня есть Список. SqlScriptModel имеет свойство «Имя», которое я использовал для сортировки списка. Имя 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

Просто переименуйте файлы так, чтобы все подстроки были одинаковой длины. Pad последняя часть версии с нулями, как это:

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

Рассмотрите возможность использования класса Version из .Net framework, у него есть подходящий оператор сравнения.

Пример кода:

 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)); 
Смежные вопросы