Как отсортировать (1,11,12,2, Все, Другие) в (Все, 1,2,11,12, Другие)? - PullRequest
1 голос
/ 01 апреля 2011


У меня есть поле со списком для отображения моих данных (varchar) из моей БД. Данные всегда "1,2,3,4, другие", когда я отображаю данные, они сортируются следующим образом:

1
10
11
12
2
3
4
All
Others

Как сделать так, чтобы раскрывающийся список выглядел так:

All
1
2
3
4
10
11
12
Others

OR

В SQL я пытаюсь ORDER BY CAST(priorityNum AS UNSIGNED INTEGER), после чего я добавляю All и Other в мой результат, который можно датировать Но как установить All и Others, чтобы они всегда были первыми и последними?

Ответы [ 7 ]

6 голосов
/ 01 апреля 2011

Пока ваша коллекция IEnumerable, вы можете вызывать OrderBy с помощью пользовательского метода сравнения. Ваш компаратор будет выглядеть так:

class myStringComparer: IComparer<string> {
    public int Compare(string a, string b) {
        if (a == b) return 0;
        if (a == "All" || b == "Others") return -1;
        if (a == "Others" || b == "All") return 1;
        return int.Parse(a) - int.Parse(b);
    }
}

Это, как есть, просто вызовет исключение, если будут обнаружены неожиданные данные (что угодно, кроме «Все», «Другие» или числа). Возможно, вы захотите добавить дополнительную логику перед попыткой целочисленного анализа.

Теперь вы можете позвонить .OrderBy(new myStringComparer()) в свой список / коллекцию. Обратите внимание, что OrderBy будет доступен только для IEnumerable объектов (включая все, что вы можете поместить в цикл foreach, например, массивы, списки и т. Д.).

1 голос
/ 01 апреля 2011

В идеале вы могли бы использовать что-то вроде List (T). Сортировать http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx#Y851

Когда вы создаете компаратор, проверьте, является ли значение целым, если это так, сравните его как обычно, если нет, то вы знаете один из ваших всех / других случаев. Затем вы возвращаете значение в зависимости от того, с какой строкой вы работаете.

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

1 голос
/ 01 апреля 2011

Есть ли причина, по которой он хранится как varchar? Это действительно должен быть int, и это решит вашу проблему - и будет правильным типом для вашего хранилища

0 голосов
/ 09 апреля 2011

Я решил это, используя CAST в SQL Comment и добавляя «Все» и «Другие» в мои данные программным способом.

0 голосов
/ 01 апреля 2011

Из первых рук, сортировка по длине, а затем по значению, которая решит вашу проблему с 11 до 2.

Для ваших двух особых слов вам понадобится немного магии.

0 голосов
/ 01 апреля 2011

Вы должны либо обрабатывать (сортировать) числа отдельно от текстов, а затем восстанавливать список. Или сохраните все элементы, которые нельзя отсортировать, в отдельном словаре, например:

All -> 0
Other -> int.MaxVallue

После того, как вы пройдете по несортированному списку, отделите нечисловые элементы (через словарь или Int.TryParse) от чисел, отсортируете номера в списке и вставляете текстовые элементы из словаря впоследствии.

Звучит сложно, но готовится к изменениям этих нечисловых элементов.

0 голосов
/ 01 апреля 2011

Вам нужен особый метод сравнения.Следует проверить, являются ли обе строки числами, а затем сравнить, используя их числовое значение.Если первое значение равно All или Others, а второе - число, первое значение меньше.Если первым является «Все», а вторым - «Другие», то первое меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...