Проблема с сортировкой объектов - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть коллекция 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, 03, 03, 3, 3, 3 в качестве даты производства, а в конце должен быть автомобиль с 2011, 02, 02 в качестве даты производства.Вторым должен быть автомобиль с 2011, 04, 04, 04, 04, 04 и третьим с 2011, 02, 02.

Я могу сделать это с помощью foreach, но я считаю, что есть более хороший способсделать это.

Ответы [ 3 ]

1 голос
/ 12 сентября 2011
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 состоит из данных + время.Вы не можете видеть, отсутствует ли часть Time!

Я добавлю, что если вам нужно использовать Enumerable.OrderBy, то вы можете использовать мою функцию lamdba с LambdaComparer, которую вы можете найти вИнтернет (как предполагает sll)

1 голос
/ 12 сентября 2011
TimeSpan zeroTime = new TimeSpan(0);
var sortedCars = cars.OrderBy(c => c.ProductionDate.TimeOfDay.Equals(zeroTime) ? 1 : 0)
                     .ThenBy(c => c.ProductionDate)
                     .ToList();
0 голосов
/ 12 сентября 2011

У меня что-то подобное

    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);

но выглядит уродливо.Я хотел бы видеть что-то более сложное:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...