Я пытаюсь отсортировать массив чисел, которые являются строками, и я бы хотел, чтобы они сортировались численно.
Загвоздка в том, что я не могу преобразовать числа в int .
Вот код:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
вывод: 101, 102, 103, 105, 90
Я бы хотел: 90, 101, 102, 103, 105
РЕДАКТИРОВАТЬ: вывод не может быть 090, 101, 102 ...
В примере кода обновлено слово «вещи» вместо «размеры». Массив может быть примерно таким:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Это означает, что его нужно отсортировать по алфавиту и по номеру:
007, 90, боб, лорен, пол
image10
прийти послеimage2
? ДолженJanuary
прийти раньшеFebruary
?Ответы:
Передайте настраиваемый компаратор в OrderBy. Enumerable.OrderBy позволит вам указать любой компаратор, который вам нравится.
Это один из способов сделать это:
источник
IsNumeric
Метод плох, исключение привода кодирования всегда плохо.int.TryParse
Вместо этого используйте . Попробуйте свой код с большим списком, и это займет вечность.Просто добавьте нули к той же длине:
источник
sizes
тоже не сработает, потому что результат другого типа. Ответ краткий, поскольку вторая строка показывает результат в виде выражения, но читатель должен что-то с ним сделать. Я добавил еще одно присвоение переменной, чтобы сделать это более понятным.А как насчет этого ...
источник
"b", "ab", "101", "103", "bob", "abcd"
.Значение - это строка
Работает
источник
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.В окнах есть встроенная функция
StrCmpLogicalW
, которая сравнивает в строках числа как числа вместо букв. Легко создать средство сравнения, которое обращается к этой функции и использует ее для сравнений.Он работает даже со строками, которые содержат как текст, так и числа. Вот пример программы, которая покажет разницу между сортировкой по умолчанию и
StrCmpLogicalW
сортировкойкоторый выводит
источник
-1 0 10 2
отсортировано как0 -1 2 10
попробуй это
Примечание: это будет полезно, когда все строки можно преобразовать в int .....
источник
ToList()
перед =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Я думаю, это будет намного лучше, если в строке будет какое-то число. Надеюсь, это поможет.
PS: Я не уверен в производительности или сложных строковых значениях, но он работал хорошо примерно так:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
источник
Вы говорите, что не можете преобразовать числа в int, потому что массив может содержать элементы, которые нельзя преобразовать в int, но попытка не повредит:
Тогда сравните вот так:
Выход: 007, 90, 90, 101, 102, 103, 105, Боб, Лорен, Пол.
источник
Это кажется странным запросом и заслуживает странного решения:
источник
На этом сайте обсуждается буквенно-цифровая сортировка и выполняется сортировка чисел в логическом смысле, а не в смысле ASCII. Он также принимает во внимание альфы вокруг него:
http://www.dotnetperls.com/alphanumeric-sorting
ПРИМЕР:
Код выглядит следующим образом:
источник
Ответ Джеффа Полсена правильный, но его
Comprarer
можно значительно упростить до следующего:Это работает, потому что единственное, что проверяется на результат,
Comparer
- это больше, меньше или равно нулю результат. Можно просто вычесть значения из другого, и не нужно обрабатывать возвращаемые значения.Также
IsNumeric
метод не должен использоватьtry
-block и может извлечь выгоду изTryParse
.И для тех, кто не уверен: этот Comparer будет сортировать значения так, чтобы нечисловые значения всегда добавлялись в конец списка. Если кто-то хочет, чтобы они были вначале,
if
нужно поменять местами второй и третий блоки.источник
Попробуй это :
источник
arr = arr.OrderBy (x => x, новый NaturalSort ()). ToArray ();
Причина, по которой мне это было нужно, заключалась в том, чтобы поместить его в каталог, имена файлов которого начинались с числа:
источник
Теперь отсортируйте списки и объедините их обратно ...
Я просто попытался внести свой вклад в этот интересный вопрос ...
источник
Мое предпочтительное решение (если все строки только числовые):
источник
источник
Расширение ответа Джеффа Полсена. Я хотел убедиться, что не имеет значения, сколько групп чисел или символов было в строках:
Я также взял SplitCharsAndNums с SO-страницы после внесения в нее поправок для работы с именами файлов.
источник
Хотя это старый вопрос, я хотел бы дать решение:
Вау, довольно просто, правда? : D
источник
источник