OrderBy内置条件

时间:2014-03-06 22:29:04

标签: c# lambda

我有一份旅行清单,我需要按照他们开始的时间排序。某些旅行没有时间,并且这些旅行在凌晨12:00时存储在数据库中。我目前正按如下方式对列表进行排序:

trips = trips.OrderBy(t => t.PickupTime);

问题在于我希望对其进行排序,以便将12:00 am旅行放在列表的底部。无法更改数据库。是否有一种优雅,干净的方式告诉OrderBy将上午12:00的时间视为最高值(可能使用DateTime.MaxValue)?

我知道我可以使用trips.Sort(delegate(..));,但是如果可能的话,我想避免这种情况。此外,我无法过滤掉这些行程,然后将它们重新添加到最后。在代码审查中没有得到满意的结果。

3 个答案:

答案 0 :(得分:3)

您可以将OrderByThenBy

一起使用
trips = trips.OrderBy(t => t.TimeOfDay == (new DateTime(2014, 1, 1, 0, 0, 0)).TimeOfDay))
             .ThenBy(t => t.PickupTime);

它将首先按排序时间为00:00:00 ,并且由于falsetrue之前出现在那种排序中,您将获得非午夜价值第一。 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());