如何按继承类的DateTime属性对List<Measurement>进行排序?
问题:按不同派生类的特定字段对List降序排序
场景与代码定义
现有基类Measurement及两个派生类:
class Measurement { public DateTime TimeStamp { get; set; } } class AdditionalMeasurement : Measurement { public DateTime PurchaseDate { get; set; } } class SpecialMeasurement: Measurement { public DateTime PrescriptionDate { get; set; } }
需求
对List<Measurement>进行降序排序:
- 默认(其他派生类)按
Measurement.TimeStamp排序 - 若为
AdditionalMeasurement类型,按PurchaseDate排序 - 若为
SpecialMeasurement类型,按PrescriptionDate排序
尝试的代码(逻辑正确但无法正常运行)
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; } });
解决方案
方法1:使用Linq的OrderByDescending(返回新列表)
你的代码逻辑本身是正确的,但OrderByDescending不会修改原列表,而是返回一个排序后的IEnumerable<Measurement>,需要将结果转为List并接收:
List<Measurement> measurements = new List<Measurement>() { ... }; // 接收排序后的新列表 var sortedMeasurements = measurements.OrderByDescending(m => { if (m is AdditionalMeasurement am) { return am.PurchaseDate; } else if (m is SpecialMeasurement sm) { return sm.PrescriptionDate; } else { return m.TimeStamp; } }).ToList();
方法2:使用List.Sort(原地排序)
如果希望直接修改原列表、无需创建创建新列表,可以用List<T>.Sort方法,自定义比较逻辑:
List<Measurement> measurements = new List<Measurement>() { ... }; measurements.Sort((x, y) => { // 提取当前对象用于排序的日期 DateTime GetSortDate(Measurement m) { return m switch { AdditionalMeasurement am => am.PurchaseDate, SpecialMeasurement sm => sm.PrescriptionDate, _ => m.TimeStamp }; } // 降序排序:用y的日期和x的日期比较 return GetSortDate(y).CompareTo(GetSortDate(x)); });
内容的提问来源于stack exchange,提问作者Behemoth
相关产品推荐
相关产品推荐

