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

标签 c# .net sorting

假设我有一个像这样的实体:

public class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
    public DateTime ReleaseDate { get; set; }
    public int NumCreated { get; set; }
}

我们正在为我们的站点使用一个简单的 MVP 架构,该架构具有 View 层(ASP.NET 网站、演示层(C# 类库)、逻辑层(C# 类库)、数据层(C# 类库)。

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

但这很痛苦,因为我需要为我拥有的每个实体维护一个枚举,并在该枚举中为实体中的每个属性维护一个条目。

因此,例如,我们会做类似的事情:

汽车逻辑.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;
}

这就是我一直以来的做法。然而,这是一个非常手动的过程,如果一个实体有很多属性,它可能会很烦人。

有什么更好的方法来处理这个问题?是否可以让我的实体集合可以根据属性进行排序,而不必像这样针对每个属性手动完成所有操作?

最佳答案

更好的处理方式是这样的:

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

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

关于c# - 有没有更简洁的方法可以在 C# 中进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525382/

相关文章:

c# - AES CBC 中的填充

c# - DbSet 查找总是返回 null

.net - 替换 WPF 入口点

c# - LINQ 为简单订单生成子查询

c# - 我的 ISP 不支持 ASP.NET MVC。我仍然可以使用其中的一部分吗?

.net - 如何从指定位置而不是 GAC 加载引用的 dll?

java - 在 C# 中验证在 Java 中签名的内容

java - 按值排序的 Map<K, V> 的前 N ​​个值

Javascript Case Insensitive Sort objects containing undefined 作为值

javascript - PHP、Jquery、Tablesorter 2.23.1 - 如何添加或删除已排序的列并刷新剩余排序?