Сортировка списка (цифры)

Budda

Client
Регистрация
13.07.2015
Сообщения
247
Благодарностей
41
Баллы
28
Сортировка списка происходит как-то криво.
Вот как отсортировало цифры по возрастанию:
13
17
3
5
7

В чем может быть проблема?
 

Ribas

Client
Регистрация
31.05.2014
Сообщения
1 440
Благодарностей
503
Баллы
113
правильно всё отсортировало, если были нули перед значениями, то было бы так
003
005
007
013
017
 

sof

Client
Регистрация
15.04.2013
Сообщения
831
Благодарностей
185
Баллы
43
потому что цифры сравниваются каждая отдельно а не все вместе
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
потому что происходит побайтовое сравнение строк. в зенопостере нет чисел (как и всего остального) - только строки.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 714
Баллы
113
Не баг, да
 

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
тоже столкнулся с такой же проблемой, как с ней можно бороться? вариант с добавлением нулей как от не очень, да и функция вроде банальнейшая.
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Сортируется с низу к верху пример - 9,8,7,6,5 можно отсортировать по возрастанию 5,6,7,8,9. Если перемешать а потом по возрастанию данный результат не получишь.
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113
Как вариант, можно сортировать цифры через JS код:

Код:
function sortNumber(a,b)
{
if(a>b)
return 1;
else return -1;
}
var n = [0.05,0.101,1.01,0.10, 40.8, 25, 100, 11.4232];
n.sort(sortNumber);
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
В списке должны быть только цифры
Код:
var stringList = project.Lists["Строки"]; //Список с цифрами для сортировки
var digitsList = new List<int>();

for(int i=0; i<stringList.Count; i++)
{
    var number = Convert.ToInt32(stringList[i]);
    digitsList.Add(number);
}
digitsList.Sort();
stringList.Clear();

for(int a=0; a<digitsList.Count; a++)
{
    var str = digitsList[a].ToString();
    stringList.Add(str);
}
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
можно так
По возрастанию
C#:
List<string> numbers = project.Lists["number"].ToList();// зеновский список
project.Lists["number"].Clear();
numbers = numbers.OrderBy(s=>s.Length).ThenBy(s=>s).ToList();
numbers.ForEach(s=>project.Lists["number"].Add(s));
По убыванию
C#:
List<string> numbers = project.Lists["number"].ToList();// зеновский список
project.Lists["number"].Clear();
numbers = numbers.OrderByDescending(s=>s.Length).ThenByDescending(s=>s).ToList();
numbers.ForEach(s=>project.Lists["number"].Add(s));
 

smartwisard

Client
Регистрация
17.01.2017
Сообщения
824
Благодарностей
83
Баллы
28

TopFlow

Client
Регистрация
24.06.2020
Сообщения
59
Благодарностей
12
Баллы
8
Вопрос закрыт) стандартный куб отрабатывает)))
Коллеги подскажите пожалуйста, а возможно ли отсортировать список с такими числами?
1.4512
1.6734
1.3535
1.2856
и тд
 
Последнее редактирование:
Регистрация
03.12.2020
Сообщения
146
Благодарностей
103
Баллы
43
Коллеги подскажите пожалуйста, а возможно ли отсортировать список с такими числами?
1.4512
1.6734
1.3535
1.2856
и тд
Добавляете в список и там уже сортируете как числа.
 
  • Спасибо
Реакции: TopFlow

sdfwef12

Новичок
Регистрация
20.12.2015
Сообщения
17
Благодарностей
1
Баллы
3
Добавляете в список и там уже сортируете как числа.
Попробовал сортировать список с числами вот так:

C#:
List<string> numbers = project.Lists["number"].ToList();// зеновский список
project.Lists["number"].Clear();
numbers = numbers.OrderBy(s=>s.Length).ThenBy(s=>s).ToList();
numbers.ForEach(s=>project.Lists["number"].Add(s));
Сортирует только целы числа корректно. Если число типа такого 395.5 , то сортирует как-то странно:
 
Регистрация
03.12.2020
Сообщения
146
Благодарностей
103
Баллы
43
Попробовал сортировать список с числами вот так:



Сортирует только целы числа корректно. Если число типа такого 395.5 , то сортирует как-то странно:
Попробуйте заменить точку на запятую.
 

sdfwef12

Новичок
Регистрация
20.12.2015
Сообщения
17
Благодарностей
1
Баллы
3

cmvvo

Client
Регистрация
07.07.2019
Сообщения
38
Благодарностей
16
Баллы
8
А как можете подсказать? Пробовал добавить Replace(".", ",") , но я C# не знаю. Пока не получилось
Примените этот код, чтобы заменить точку на запятую в каждой строке списка:


C#:
IZennoList list1 = project.Lists["Список"];
List<string> lstTemp = new List<string>();

foreach(var s in list1){
 
  lstTemp.Add(Macros.TextProcessing.Replace(s, ".", ",", "Text", "All"));
}

list1.Clear(); // очищаем список
list1.AddRange(lstTemp); // сейвим временный список
 
Последнее редактирование:

Remart

Client
Регистрация
06.10.2016
Сообщения
52
Благодарностей
10
Баллы
8
Други, здравия! А если список не цифры, а текст. И нужно отсортировать или фильтрануть по длинне строк. Я так понимаю тут только копировать список в ексель, там делать и забирать назад?
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
545
Благодарностей
1 124
Баллы
93
Други, здравия! А если список не цифры, а текст. И нужно отсортировать или фильтрануть по длинне строк. Я так понимаю тут только копировать список в ексель, там делать и забирать назад?
Не нужен excel.)

94930 94931
Сортировка списка по количеству символов:
string[] array = project.Lists["ZennList"].ToArray();
project.Lists["ZennList"].Clear();
List<string> list = array.OrderBy(x => x.Length).ToList();
project.Lists["ZennList"].AddRange(list);
Приложил шаблон в котором отработан пример ↓.
 

Вложения

Remart

Client
Регистрация
06.10.2016
Сообщения
52
Благодарностей
10
Баллы
8
Это .. просто ..

94955

Благодарствую, друже!
 
  • Спасибо
Реакции: djaga

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 599
Благодарностей
1 196
Баллы
113
можно так
По возрастанию
C#:
List<string> numbers = project.Lists["number"].ToList();// зеновский список
project.Lists["number"].Clear();
numbers = numbers.OrderBy(s=>s.Length).ThenBy(s=>s).ToList();
numbers.ForEach(s=>project.Lists["number"].Add(s));
Кстати, в процессе случайно выяснил, что числа меньше единицы (0,1 и т.д.) при сортировке по возрастанию этим сниппетом почему-то ставятся в конец (после всех других чисел) О_о

update. Оказалось, дело не в числах меньше единицы, а в неверном сравнении сниппетом целых чисел с десятичными.
Вот этот сниппет расставляет правильно:
C#:
List<string> numbers = project.Lists["number"].ToList();
project.Lists["number"].Clear();
var nums = numbers.Select(s => double.Parse(s.Trim().Replace('.',','))).ToList();
nums.Sort();
nums.ForEach(s => project.Lists["number"].Add(s.ToString()));
Мало ли кому пригодится в дальнейшем.
 
Последнее редактирование:
  • Спасибо
Реакции: djaga

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)