Я пытаюсь выполнить довольно простой порядок, но, похоже, борется за то, как это сделать. Возьмем, к примеру, у меня эти два класса.Linq OrderBy Sub List
public class Method
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public List<Slot> Slots { get; set; }
}
public class Slot
{
public DateTime ExpectedDeliveryDate { get; set; }
}
Используя код ниже, я хочу заказать по самой дешевой цене, а затем самой быстрой датой поставки.
var methods = new List<Method>();
methods.Add(new Method { Id = 1, Name = "Standard", Price = 0M, Slots = new List<Slot> { new Slot { ExpectedDeliveryDate = DateTime.Now.AddDays(5).Date } } });
methods.Add(new Method { Id = 2, Name = "Super Fast Next Day", Price = 0M, Slots = new List<Slot> { new Slot { ExpectedDeliveryDate = DateTime.Now.AddDays(1).Date } } });
var b = methods.OrderBy(x => x.Price)
.ThenBy(y => y.Slots.OrderBy(t => t.ExpectedDeliveryDate.Date)
.ThenBy(t => t.ExpectedDeliveryDate.TimeOfDay))
.ToList();
Проблема я получаю здесь в том, что я получаю сообщение об ошибке выполнения заявив, что «по крайней мере один объект должен реализовывать IComparable».
Хотя я могу исправить это, реализовав интерфейс IComparable, мне было интересно, можно ли это сделать. Я полагаю, что есть такой код (см. Ниже), он работает нормально.
var slots = new List<Slot>();
slots.Add(new Slot { ExpectedDeliveryDate = DateTime.Now.AddDays(5).Date });
slots.Add(new Slot { ExpectedDeliveryDate = DateTime.Now.AddDays(1).Date });
slots.Add(new Slot { ExpectedDeliveryDate = DateTime.Now.AddDays(3).Date });
slots.Add(new Slot { ExpectedDeliveryDate = DateTime.Now.Date });
var d = slots.OrderBy(x => x.ExpectedDeliveryDate);
Cheers, DS.
Извинения за присвоение имен таких переменных, как xyz
в приведенном выше примере :) Код может быть скопирован и вставлен для удовольствия от манипуляции.
EDIT - Обновлен, чтобы упростить пример кода. - Ожидание результата будет после успешной сортировки
Input
ID Name Price Slot
1 Standard 0 DateTime.Now.AddDays(5).Date
2 Super Fast 0 DateTime.Now.Date
Output
2 Super Fast 0 DateTime.Now.Date
1 Standard 0 DateTime.Now.AddDays(5).Date
Так что мой супер быстрый вариант должен быть сверху из-за его самым дешевым и, конечно, имеет самый быстрый срок поставки.
Это не ясно, что вы ожидаете, что это * значит * заказать коллекцию способов доставки их слотов. Можете ли вы предоставить образцы данных и ожидаемые результаты? И почему вы заказываете год, а затем месяц, а затем дату (что не значит, что, по-вашему, вы думаете, это значит), а не просто заказывать самим ExpectedDeliveryDate? –
Извините, вы сделаете это. –
@DrSchizo Часть, которую вы еще не выяснили, состоит в том, что каждый из ваших методов может иметь несколько слотов, но ваш пример ожидаемых результатов показывает только один слот для каждого метода. Каково ожидаемое поведение, когда метод имеет несколько слотов? Когда у него есть нулевые слоты? Вам нужно решить, что должно произойти в этом случае, чтобы этот вопрос имел смысл. – JLRishe