2017-02-22 108 views
1

Я пытаюсь сортировать список строк в порядке, соответствующем последовательности, используемой в обычных последовательностях истории версий. Некоторые клиенты начинают с «-» или «Новый» или нескольких других специальных кодов, и я могу использовать LINQ для определения пользовательского порядка сортировки. Однако после того, как рисунок был пересмотрен с Rev A на всем протяжении Rev Z, он становится Rev AA через Rev AZ, затем Rev BA через BZ и так далее. Как я могу сортировать следующий список с помощью LINQ?Сортировка списка строк с использованием linq с настраиваемой сортировкой

у меня есть это в качестве примера блок кода:

List<string> revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
              "PD2", "B", "-", "*", "BB", "NA" }; 
revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
        ThenByDescending(i => i.ToLower() == "nc"). 
        ThenByDescending(i => i.ToLower() == "na"). 
        ThenByDescending(i => i.ToLower() == "new"). 
        ThenByDescending(i => i.ToLower() == "pd1"). 
        ThenByDescending(i => i.ToLower() == "pd2"). 
        ThenByDescending(i => i.ToLower() == "-"). 
        ThenByDescending(i => i.ToLower() == "*"). 
        ThenBy(i => i).ToList(); 

foreach (string rev in revList) 
    Console.WriteLine(rev); 

Это производит вывод, как:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
AB 
B 
B 

Я хотел бы произвести:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
B 
AB 
BB 
+2

Сортировка по длине сначала, например. Вставьте 'ThenBy (i => i.Length) .' перед' ThenBy (i => i) ' –

+1

Иван, вы побеждаете. Хотел бы я проголосовать за ваш ответ, так как это было первым, но это был комментарий. Спасибо. – AuLion

+0

Почему «PD» пришел до «NC» - это нужный результат? –

ответ

2

Этот код работал меня.

var revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
             "PD2", "B", "-", "*", "BB", "NA" }; 

     revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
          ThenByDescending(i => i.ToLower() == "nc"). 
          ThenByDescending(i => i.ToLower() == "na"). 
          ThenByDescending(i => i.ToLower() == "new"). 
          ThenByDescending(i => i.ToLower() == "pd1"). 
          ThenByDescending(i => i.ToLower() == "pd2"). 
          ThenByDescending(i => i.ToLower() == "-"). 
          ThenByDescending(i => i.ToLower() == "*"). 
          ThenBy(i => i.Length).ToList(); 

     foreach (string rev in revList) 
      Console.WriteLine(rev); 
     Console.ReadLine(); 
+0

Спасибо, Самир! Я не могу поверить, что я об этом не думал. – AuLion

0

Вы можете создать пользовательский объект, как это:

class Revision 
{ 
    public string Name { get; set; } 
    public int Rank { get; set; } 

    public Revision(string Name, int Rank) 
    { 
     this.Name = Name; 
     this.Rank = Rank; 
    } 
} 

Затем вы можете создать список этих объектов.

Что-то вроде:

List<Revision> revisions = new List<Revision>(); 
revision.Add(new Revision("PD",1)); 
revision.Add(new Revision("NC",2)); 

Теперь, когда вы можете сортировать по рангу с использованием LINQ вместо того, чтобы пытаться разобрать имена.

Может быть, больно настроить объект изначально, так как вам может потребоваться выйти на ZZ, но это даст вам полный контроль над порядком.

p.s. - Я не тестировал этот код.

 Смежные вопросы

  • Нет связанных вопросов^_^