【发布时间】:2014-12-29 18:33:31
【问题描述】:
我正在尝试执行一个相当简单的订单,但似乎在努力解决如何去做。以我有这两个类为例。
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);
干杯,DS。
对于上面示例中的变量命名(例如 xyz)表示歉意 :) 可以复制和粘贴代码以获得操作乐趣。
编辑 - 更新以简化代码示例。 - 排序成功后的预期结果
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 您尚未澄清的部分是您的每个方法都可以有多个插槽,但是您的预期结果示例仅显示每个方法一个插槽。当一个方法有多个插槽时,预期的行为是什么?什么时候有零槽?为了让这个问题有意义,您需要决定在这种情况下应该发生什么。
-
约翰已经回答了这类问题:stackoverflow.com/a/14141926/213550
-
如果它有多个插槽,那么它应该选择日期最早的项目到今天。我开始认为唯一的选择是实现 IComparable .. @Admin 为编辑欢呼,不知道如何在现场格式化表格:)
-
@DrSchizo 如果有一些零槽怎么办?