c# alphanumeri c сортировка списка путем проверки, содержит ли элемент списка - PullRequest
3 голосов
/ 06 февраля 2020

У меня есть List<string> как это

List<string> Test_List = new List<string>()
{
    "ZZA-KG-TEST",
    "ZZA-EG-TEST",
    "ZZA-KL-10A",
    "ZZA-KL-5A",
    "ZZA-KL-1A",
    "ZZA-FG-TEST",
    "RO-ELEVER"
};

Ожидаемый вывод после сортировки

List<string> Test_List = new List<string>()
{
    "ZZA-KL-1A",
    "ZZA-KL-5A",
    "ZZA-KL-10A",
    "ZZA-KG-TEST",
    "ZZA-FG-TEST",
    "ZZA-EG-TEST",
    "RO-ELEVER"
};

Что я на самом деле получаю это

List<string> Test_List = new List<string>()
{
    "ZZA-KL-1A",
    "ZZA-KL-5A",
    "ZZA-KL-10A",
    "RO-ELEVER"
    "ZZA-EG-TEST",
    "ZZA-FG-TEST",
    "ZZA-KG-TEST",
};

Мой код такой

var data = Test_List
    .OrderByDescending(i => i.Contains("-KL-"))
    .ThenBy(i => i, new AlphanumericComparer())
    .ThenByDescending(i => i.Contains("-KG-"))
    .ThenBy(i => i, new AlphanumericComparer())
    .ThenByDescending(i => i.Contains("-FG-"))
    .ThenBy(i => i, new AlphanumericComparer())
    .ThenByDescending(i => i.Contains("-EG-"))
    .ThenBy(i => i, new AlphanumericComparer());

class AlphanumericComparer : IComparer<string>
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    static extern int StrCmpLogicalW(string s1, string s2);

    public int Compare(string x, string y) => StrCmpLogicalW(x, y);
}

Есть мысли?

РЕДАКТИРОВАТЬ Мне нужны все элементы, содержащие -KL- приходит в top и затем закажите их в -KL- и то же самое для -KG-, -FG- и -EG-, а затем для остальных

1 Ответ

4 голосов
/ 06 февраля 2020

Вы, вероятно, хотите сначала заказать группы (KL, KG, FG, EG, all_the_rest именно в этом порядке):

.OrderByDescending(i => i.Contains("-KL-"))
.ThenByDescending(i => i.Contains("-KG-"))
.ThenByDescending(i => i.Contains("-FG-"))
.ThenByDescending(i => i.Contains("-EG-"))

И только затем заказывать элементы в каждой группе :

.ThenBy(i => i, new AlphanumericComparer());

т.е.

var data = Test_List
  .OrderByDescending(i => i.Contains("-KL-"))
  .ThenByDescending(i => i.Contains("-KG-"))
  .ThenByDescending(i => i.Contains("-FG-"))
  .ThenByDescending(i => i.Contains("-EG-"))
  .ThenBy(i => i, new AlphanumericComparer());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...