Строка "Шаблон сортировки" в C # - PullRequest
4 голосов
/ 18 декабря 2008

Я пытаюсь найти чистый способ сортировки набора строк на основе «шаблона сортировки». Я извиняюсь, если моя формулировка сбивает с толку, но я не могу придумать лучшего способа описать ее (может быть, кто-то может придумать лучший способ описать ее после прочтения того, что я пытаюсь сделать?).

Рассмотрим следующий список строк (мой «шаблон сортировки», каждый элемент в списке «команда»):

  • [FA, TY, AK, PO, PR, ZZ, QW, BC]

Я бы хотел использовать порядок строк в этом списке для сортировки списка этих команд. Например, я хотел бы следующий список:

  • [TY, PR, PR, ZZ, BC, AK]

для сортировки в следующем списке на основе «шаблона сортировки»:

  • [TY, AK, PR, PR, ZZ, BC]

Что было бы хорошим способом добиться этого? Лучшая идея, которую я имею, - это использовать перечисление ...

enum Command
{
    FA,
    TY,
    AK,
    PO,
    PR,
    ZZ,
    QW,
    BC
};

... и выполнить Enum.Parse () для каждой команды в моем списке, который я хочу отсортировать, преобразовав этот список из списка строк в список команд, которые затем будут отсортированы в соответствии с порядком перечисления .

Я не знаю. Перечисление выглядит так, как будто оно будет работать, но есть ли лучший способ, которым я мог бы пойти по этому поводу?

Ответы [ 4 ]

3 голосов
/ 19 декабря 2008

Вот очень простой способ сделать это!

List<string> template = new List<string>{ "ZD", "AB", "GR"};

List<string> myList = new List<string>{"AB", "GR", "ZD", "AB", "AB"};
myList.Sort((a, b) => template.IndexOf(a).CompareTo(template.IndexOf(b)));
2 голосов
/ 19 декабря 2008

Вы можете использовать Dictionary<string, int> для хранения и получения токенов шаблона сортировки. Тем не менее, это в основном то же самое, что и ваше перечисление (только, возможно, чуть более читабельным образом), потому что Enum.Parse здесь может сбить с толку.

var ordering = Dictionary<string, int>();
ordering.Add("FA", 0);
ordering.Add("TY", 1); // …

MyList.Sort((a, b) => ordering[a].CompareTo(ordering[b]));

При этом используется соответствующая перегрузка метода List<T>.Sort для сравнения двух элементов на основе их значения в словаре template.

1 голос
/ 19 декабря 2008

Используйте шаблон Command (я думаю, что он называется)

написать метод сортировки, который сортирует список, но использует внешний метод для сравнения пар объектов ... Затем передайте его делегату методу сравнения ... Напишите метод сравнения, чтобы взять два члена list и шаблон сортировки в качестве входных параметров ... В этом методе возвращают -1, 0 или + 1 в зависимости от того, найден ли первый член пары или второй член первым в списке шаблонов.
В вашем методе sort используйте возвращаемое значение из метода сравнения для реализации сортировки, независимо от того, какой тип сортировки вы делаете ...

1 голос
/ 19 декабря 2008

Вы можете переименовать ваши команды как

[1FA, 2TY, 3AK, 4PO, 5PR, 6ZZ, 7QW, 8BC]

и удалите первый символ, когда вы будете готовы его использовать. Я думаю, что это называется kludge .

Я не могу не думать, что вы можете получить некоторое преимущество от использования SortedList, но в действительности он, вероятно, будет работать более или менее подобно вашему enum

SortedList Commands = new SortedList();
Commands.Add(1,FA);
Commands.Add(2,TY);
//etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...