#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, то добавляем один день: в итоге это значение становится больше остальных и при сортировке по возрастанию окажется в конце.
Комментариев нет:
Отправить комментарий