我有一份旅行清单,我需要按照他们开始的时间排序。某些旅行没有时间,并且这些旅行在凌晨12:00时存储在数据库中。我目前正按如下方式对列表进行排序:
trips = trips.OrderBy(t => t.PickupTime);
问题在于我希望对其进行排序,以便将12:00 am旅行放在列表的底部。无法更改数据库。是否有一种优雅,干净的方式告诉OrderBy将上午12:00的时间视为最高值(可能使用DateTime.MaxValue
)?
我知道我可以使用trips.Sort(delegate(..));
,但是如果可能的话,我想避免这种情况。此外,我无法过滤掉这些行程,然后将它们重新添加到最后。在代码审查中没有得到满意的结果。
答案 0 :(得分:3)
您可以将OrderBy
与ThenBy
:
trips = trips.OrderBy(t => t.TimeOfDay == (new DateTime(2014, 1, 1, 0, 0, 0)).TimeOfDay))
.ThenBy(t => t.PickupTime);
它将首先按排序时间为00:00:00 ,并且由于false
在true
之前出现在那种排序中,您将获得非午夜价值第一。 ThenBy
会使用标准DateTime
比较对非午夜值进行排序。
答案 1 :(得分:2)
您可以通过
在订单中使用条件运算符var midnight = new DateTime(0).TimeOfDay;
trips = trips.OrderBy(t=> t.PickupTime.TimeOfDay == midnight ?
DateTime.MaxValue :
t.PickupTime);
答案 2 :(得分:0)
我建议编写自己的继承IComparer的比较器,并在OrderBy中使用它来代替默认的比较器。如果你给我什么类型的PickupTime,我可以给你一个更具体的例子,但这里有一个字符串比较器,我确保空字符串是最后一个:
public class EmptyStringsAreLast : IComparer<string>
{
public int Compare(string x, string y)
{
if (String.IsNullOrEmpty(y) && !String.IsNullOrEmpty(x))
{
return -1;
}
else if (!String.IsNullOrEmpty(y) && String.IsNullOrEmpty(x))
{
return 1;
}
else
{
return String.Compare(x, y);
}
}
}
您可以使用它:
//assuming Person has a Name property that is a string
IEnumerable<Person> bunchOfPeople = getPeople();
bunchOfPeople.OrderBy(p => p.Name, new EmptyStringsAreLast());