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