排序对象的问题

时间:2011-09-12 14:15:32

标签: linq sorting c#-4.0

我收集了Car

var cars = new List<Car>();
cars.Add(new Car { ProductionDate = new DateTime(2011,02,02) });
cars.Add(new Car { ProductionDate = new DateTime(2011, 01, 01) });
cars.Add(new Car { ProductionDate = new DateTime(2011,04,04,04,04,04) });
cars.Add(new Car { ProductionDate = new DateTime(2011, 03, 03, 3, 3, 3) });

我需要按ProductionDate对其进行排序。

结果应该是起初我会有带时间日期的车,所以它应该是2011,203,03,3,3,3作为生产日期的车,最后应该是2011,202车,02作为生产日期。第二个应该是2011年,04年,04年,04年,04年,04年的汽车,以及2011年,02年,02年的第三个。

我可以使用foreach来做到这一点,但我相信有更好的方法可以做到。

3 个答案:

答案 0 :(得分:1)

TimeSpan zeroTime = new TimeSpan(0);
var sortedCars = cars.OrderBy(c => c.ProductionDate.TimeOfDay.Equals(zeroTime) ? 1 : 0)
                     .ThenBy(c => c.ProductionDate)
                     .ToList();

答案 1 :(得分:1)

cars.Sort((p, q) => {
    var tm1 = p.ProductionDate.TimeOfDay;
    var tm2 = q.ProductionDate.TimeOfDay;

    if (tm1.Ticks == 0) {
        if (tm2.Ticks == 0) {
            return p.ProductionDate.CompareTo(q.ProductionDate);
        }
        return 1;
    } else if (tm2.Ticks == 0) {
        return -1;
    } else {
        return p.ProductionDate.CompareTo(q.ProductionDate);
    }
});

但请记住:如果汽车是在0:00建造的,会发生什么? DateTime由数据+时间组成。你无法看到时间部分是否缺失!

我要补充一点,如果您需要使用Enumerable.OrderBy,那么您可以将我的lamdba函数与您在互联网上找到的LambdaComparer一起使用(由sll建议)

答案 2 :(得分:0)

我有类似的东西

    var carsWithoutProductionTime = from car in cars
                                    where car.ProductionDate.Hour == 0
                                    orderby car.ProductionDate
                                    select car;

    var carsWithProductionTime = from car in cars
                                 where car.ProductionDate.Hour != 0
                                 orderby car.ProductionDate
                                 select car;

    var mergedCars = carsWithProductionTime.Union(carsWithoutProductionTime);

但它看起来很难看。我希望看到更复杂的东西:)