#c# #linq
Вопрос:
В настоящее время у меня есть список людей, которых я хотел бы отсортировать по временным промежуткам в списке. Мой класс выглядит так, как показано ниже:
public class PersonClass
{
public string name { get; set; }
public TimeSpan Time { get; set; }
public TimeSpan OfficialTime { get; set; }
}
Поэтому я хотел бы отсортировать сразу по двум столбцам и отобразить наименьшее время в двух столбцах, но только в том случае, если значение действительно присутствовало и придавало больший вес официальному времени
Поэтому приведу несколько примеров
Person1; Time:00:03:02; OfficialTime:00:03:01
Person2; Time:00:02:54; OfficialTime:00:02:55
Person3; Time:00:02:56; OfficialTime:00:00:00
Person4; Time:00:00:00; OfficialTime:00:00:00
Person5; Time:00:00:00; OfficialTime:00:02:57
Person6; Time:00:01:16; OfficialTime:00:02:58
Поэтому для сортировки мне нужно выполнить сортировку по официальному времени, когда оно доступно и превышает 0.
Если есть Люди, у которых есть Время, но нет официального времени, то я хотел бы использовать это Время в Сортировке.
Если и время, и официальное время равны 0, их не следует добавлять в список tmpList.
Таким образом, в приведенном выше примере порядок будет:
Person2; Time:00:02:54; OfficialTime:00:02:55
Person3; Time:00:02:56; OfficialTime:00:00:00
Person5; Time:00:00:00; OfficialTime:00:02:57
Person6; Time:00:01:16; OfficialTime:00:02:58
Person1; Time:00:03:02; OfficialTime:00:03:01
Поэтому я попытался использовать следующий код:
var tmpList = Persons.OrderBy(x => x.OfficialTime)
.ThenBy(x => x.Time)
.Where(x => x.OfficialTime > TimeSpan.FromSeconds(0) || x.Time > TimeSpan.FromSeconds(0))
.ToList();
Итак, каков был бы правильный подход к этому?
Для вашего сведения:
private void test()
{
List<PersonClass> Persons = new List<PersonClass>();
Persons.Add(new PersonClass() { name = "Person 1", Time = TimeSpan.Parse("00:03:02"), OfficialTime = TimeSpan.Parse("00:03:01") });
Persons.Add(new PersonClass() { name = "Person 2", Time = TimeSpan.Parse("00:02:54"), OfficialTime = TimeSpan.Parse("00:02:55") });
Persons.Add(new PersonClass() { name = "Person 3", Time = TimeSpan.Parse("00:02:56"), OfficialTime = TimeSpan.Parse("00:00:00") });
Persons.Add(new PersonClass() { name = "Person 4", Time = TimeSpan.Parse("00:00:00"), OfficialTime = TimeSpan.Parse("00:00:00") });
Persons.Add(new PersonClass() { name = "Person 5", Time = TimeSpan.Parse("00:00:00"), OfficialTime = TimeSpan.Parse("00:02:57") });
Persons.Add(new PersonClass() { name = "Person 6", Time = TimeSpan.Parse("00:01:16"), OfficialTime = TimeSpan.Parse("00:02:58") });
var tmpList = Persons.OrderBy(x => x.OfficialTime)
.ThenBy(x => x.Time)
.Where(x => x.OfficialTime > TimeSpan.FromSeconds(0) || x.Time > TimeSpan.FromSeconds(0))
.ToList();
}
Спасибо
Ответ №1:
Может быть
var results = Persons
.Where(x => x.OfficialTime > TimeSpan.Zero || x.Time > TimeSpan.Zero)
.OrderBy(x => x.OfficialTime > x.Time ? x.OfficialTime : x.Time )
.ToList();
Выход
00:02:54 00:02:55
00:02:56 00:00:00
00:00:00 00:02:57
00:01:16 00:02:58
00:03:02 00:03:01
Комментарии:
1. Это, кажется, делает свою работу! Спасибо @TheGeneral!