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

  • Автор темы Автор темы Budda
  • Дата начала Дата начала

Budda

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

В чем может быть проблема?
 
потому что цифры сравниваются каждая отдельно а не все вместе
 
потому что происходит побайтовое сравнение строк. в зенопостере нет чисел (как и всего остального) - только строки.
 
Не баг, да
 
тоже столкнулся с такой же проблемой, как с ней можно бороться? вариант с добавлением нулей как от не очень, да и функция вроде банальнейшая.
 
Сортируется с низу к верху пример - 9,8,7,6,5 можно отсортировать по возрастанию 5,6,7,8,9. Если перемешать а потом по возрастанию данный результат не получишь.
 
Как вариант, можно сортировать цифры через 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);
 
В списке должны быть только цифры
Код:
Развернуть Свернуть Копировать
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);
}
 
можно так
По возрастанию
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));
 
Вопрос закрыт) стандартный куб отрабатывает)))
Коллеги подскажите пожалуйста, а возможно ли отсортировать список с такими числами?
1.4512
1.6734
1.3535
1.2856
и тд
 
Последнее редактирование:
Коллеги подскажите пожалуйста, а возможно ли отсортировать список с такими числами?
1.4512
1.6734
1.3535
1.2856
и тд
Добавляете в список и там уже сортируете как числа.
 
  • Оценить
Реакции: TopFlow
Добавляете в список и там уже сортируете как числа.

Попробовал сортировать список с числами вот так:

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 , то сортирует как-то странно:
scr.jpg
 
Попробовал сортировать список с числами вот так:



Сортирует только целы числа корректно. Если число типа такого 395.5 , то сортирует как-то странно:
scr.jpg
Попробуйте заменить точку на запятую.
 
А как можете подсказать? Пробовал добавить 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); // сейвим временный список
 
Последнее редактирование:
Други, здравия! А если список не цифры, а текст. И нужно отсортировать или фильтрануть по длинне строк. Я так понимаю тут только копировать список в ексель, там делать и забирать назад?
 
Други, здравия! А если список не цифры, а текст. И нужно отсортировать или фильтрануть по длинне строк. Я так понимаю тут только копировать список в ексель, там делать и забирать назад?
Не нужен 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);

Приложил шаблон в котором отработан пример ↓.
 

Вложения

Это .. просто ..

94955

Благодарствую, друже!
 
  • Оценить
Реакции: djaga
можно так
По возрастанию
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

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