Beh*_*oth 3 .net c# linq sorting
考虑以下情况。我有一个基类Measurement和几个继承自的派生类(例如AdditionalMeasurement和SpecialMeasurement)Measurement
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)
经典的 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。如果您有许多不同的排序逻辑,这可能会有所帮助。
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |