Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Сортировка массива строк с числовыми значениями C#

#c_sharp #массивы #сортировка


Подскажите, как сортировать такой массив строк:


  "text‡11:35"
  "other_text‡16:30"
  "other_text1‡00:30"
  ...
  "more_other_text‡12:30"  


Так, чтобы сами строки остались теми же строками (изменять нельзя) по возрастанию
времени в конце строки, и строки с окончанием 00:** ушли в конец также отсортированные
по возрастанию в своей группе.
Пожалуйста, опишите словами, или примером на C#.  

После проб и ошибок, нужный сорт получился с подсказки A Petrov вот этот код отсортировал
- как надо.

    private void SortLinksBySessTime()
    {
        string[] result = (from s in sessLinks
                      let dt = DateTime.Parse(s.Substring(s.Length - 5))
                      let dt2 = dt.Hour == 0 ? dt.AddDays(1) : dt
                      orderby dt2
                      select s)
         .ToArray();
    }

    


Ответы

Ответ 1



Как-то так?: var lines = new []{ "text‡11:35", "other_text‡16:30", "other_text1‡00:30", "more_other_text‡12:30" }; var sorted = (from line in lines let time = TimeSpan.Parse(line.Substring(line.IndexOf('‡') + 1)) orderby time descending select line).ToList();

Ответ 2



Добавлю более оптимальный вариант items.Select(i=> new {I=i, sort= ПарсингСтроки(I)}).OrderBy (i =>i.sort).Select(i=>i.I); То есть сначала преобразум в класс с полем sort, отсортируем по этому полу, а затем получим первоначальные данные. Плюс в том, что данные будут парсится один раз. Можно проверить Кстати это по мотивам Как перемешать (случайно переставить) элементы в массиве?

Ответ 3



Так и не понял, с чем именно у вас проблема: с извлечением времени, с его парсингом или с такой сортировкой, чтобы время 00 было в конце? Попробуйте так. Синтаксис методов: var result = list.Select(s => { var dt = DateTime.Parse(s.Substring(s.Length - 5)); if (dt.Hour == 0) dt = dt.AddDays(1); return new { s, dt }; }) .OrderBy(a => a.dt) .Select(a => a.s) .ToList(); Синтаксис запросов (в данном случае проще и понятнее): var result = (from s in list let dt = DateTime.Parse(s.Substring(s.Length - 5)) let dt2 = dt.Hour == 0 ? dt.AddDays(1) : dt orderby dt2 select s) .ToList(); Берём последние пять символов и парсим как время. Если час равен 0, то добавляем один день: в итоге это значение становится больше остальных и при сортировке по возрастанию окажется в конце.

Комментариев нет:

Отправить комментарий