我收集了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
来做到这一点,但我相信有更好的方法可以做到。
答案 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);
但它看起来很难看。我希望看到更复杂的东西:)