有没有更简洁的方法可以在C#中进行排序?

Kin*_*tor 2 .net c# sorting

可以说我有一个像以下的实体:

public class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public DateTime ReleaseDate { get; set; }
    public int NumCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们正在为我们的站点使用一个简单的MVP架构,其中包含一个View Layer(ASP.NET网站,Presenter Layer(C#类库),Logic Layer(C#类库),Data Layer(C#类库).

假设我有一个视图,显示带有可排序列标题的汽车列表.我过去一直在做的是在我的逻辑层中进行所有排序,并且视图为实体列表需要排序的任何列传递枚举.

这是一种痛苦,因为我需要为我拥有的每个实体维护一个枚举,并为该实体中的每个属性保留该枚举中的一个条目.

所以,例如,我们会做类似的事情:

CarLogic.cs

public IEnumerable<Car> GetCarsByYear(string year, SortColumn sortColumn, SortOrder sortOrder)
{
    List<Car> cars = _carRepository.GetCarsByYear(year);  

    switch (sortColumn)
    {
        case SortColumn.Make:
            cars.Sort((car1, car2) =>
                    sortOrder == SortOrder.Ascending
                    ? car1.Make.CompareTo(car2.Make) :
                      car2.Make.CompareTo(car1.Make);
            break;
       case SortColumn.Model:
            cars.Sort((car1, car2) =>
                    sortOrder == SortOrder.Ascending
                    ? car1.Model.CompareTo(car2.Model) :
                      car2.Model.CompareTo(car1.Model);
            break;
       case SortColumn.ReleaseDate:
            cars.Sort((car1, car2) =>
                    sortOrder == SortOrder.Ascending
                    ? car1.ReleaseDate.CompareTo(car2.ReleaseDate) :
                      car2.ReleaseDate.CompareTo(car1.ReleaseDate);
            break;
       case SortColumn.NumCreated:
            cars.Sort((car1, car2) =>
                    sortOrder == SortOrder.Ascending
                    ? car1.NumCreated.CompareTo(car2.NumCreated) :
                      car2.NumCreated.CompareTo(car1.NumCreated);
            break;
       // ...
    }

    return cars;
}
Run Code Online (Sandbox Code Playgroud)

这就是我一直在做的事情.但是,这是一个非常手动的过程,如果一个实体有很多属性,它可能会很烦人.

什么是更好的方法来处理这个?是否可以允许我的实体集合在属性上进行排序,而不必像这样手动执行所有属性?

mqp*_*mqp 12

处理它的更好方法是:

public IEnumerable<Car> GetCarsByYear<T>(string year, SortOrder sortOrder,
    Func<Car, T> fieldSelector) where T : IComparable<T>
{
    List<Car> cars = _carRepository.GetCarsByYear(year);  

    cars.Sort((car1, car2) =>
        sortOrder == sortOrder.Ascending
        ? fieldSelector(car1).CompareTo(fieldSelector(car2)) :
          fieldSelector(car2).CompareTo(fieldSelector(car1)));

    return cars;
}

GetCarsByYear(2010, SortOrder.Ascending,  c => c.Model);
GetCarsByYear(2008, SortOrder.Descending, c => c.Make);
Run Code Online (Sandbox Code Playgroud)

正如上面提到的海报,使用OrderBy而不是将其存储在列表中也更自然.