Упорядочение Linq по нескольким значениям

#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!