如何按继承类的 DateTime 属性对列表进行排序?

Beh*_*oth 3 .net c# linq sorting

考虑以下情况。我有一个基类Measurement和几个继承自的派生类(例如AdditionalMeasurementSpecialMeasurementMeasurement

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

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

class SpecialMeasurement: Measurement {
   public DateTime PrescriptionDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何按默认值List<Measurement>降序排序Measurement.TimeStamp(=对于所有其他派生类),但如果列表中的项目的类型为AdditionalMeasurementbyPurchaseDate且项目的类型为SpecialMeasurementby 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

nvo*_*igt 6

经典的 OOP 方法是让每个类为自己定义/覆盖其排序标准:

using System;

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

   public virtual DateTime SortDate => this.TimeStamp;
}

class AdditionalMeasurement : Measurement {
   public DateTime PurchaseDate { get; set; }
    
    public override DateTime SortDate => this.PurchaseDate;
}

class SpecialMeasurement: Measurement {
   public DateTime PrescriptionDate { get; set; }
    
    public override DateTime SortDate => this.PrescriptionDate;
}

                    
public class Program
{
    public static void Main()
    {
        var measurements = new List<Measurement>() { };

        var ordered = measurements.OrderBy(m => m.SortDate).ToList();

    }
}
Run Code Online (Sandbox Code Playgroud)

您的具体问题可能是OrderBy返回一个有序的 Enumerable,它不会对现有列表进行排序。您的调用不使用返回值表明您可能没有意识到这一点。提高编译器的警告级别,这应该是编译器警告。

您可以使用 的Sort方法List<T>对列表进行排序,然后您可以将要对日期进行排序的逻辑放入类中Comparer。如果您有许多不同的排序逻辑,这可能会有所帮助。