Search code examples
c#.netlinqsorting

How can I sort a List by DateTime properties of inherited classes?


Consider the following situation. I have a base class Measurement and several derived classes (e. g. AdditionalMeasurement and SpecialMeasurement) that inherit from Measurement

class Measurement {
   public DateTime TimeStamp { get; set; }
}

class AdditionalMeasurement : Measurement {
   public DateTime PurchaseDate { get; set; }
}

class SpecialMeasurement: Measurement {
   public DateTime PrescriptionDate { get; set; }
}

How can I sort a List<Measurement> descending by Measurement.TimeStamp per default (=for all other derived classes) but if an item in the list is of type AdditionalMeasurement by PurchaseDate and if a item is of type SpecialMeasurement by PrescriptionDate?

Obviously, my try below doesn't work but hopefully shows the idea.

List<Measurement> measurements = new List<Measurement>() { ... };
measurements.OrderByDescending(m =>
{
    if (m is AdditionalMeasurement additionalMeasurement)
    {
        return additionalMeasurement.PurchaseDate;
    }
    else if (m is SpecialMeasurement specialMeasurement)
    {
        return specialMeasurement.PrescriptionDate;
    }
    else
    {
        return m.TimeStamp;
    }
});

Solution

  • If you dont want to change the classes as nvoigt suggested, this code is a shorter and correctly uses ToList and assigns the result to the original list:

    measurements = measurements.OrderByDescending(m => m switch
    {
        AdditionalMeasurement additionalMeasurement => additionalMeasurement.PurchaseDate,
        SpecialMeasurement specialMeasurement => specialMeasurement.PrescriptionDate,
        _ => m.TimeStamp
    }).ToList()
    

    So the problem with your code was mainly that you didn't use the IEnumerable<Measurement> returned from OrderByDescending to create a new list(ToList).