代码之家  ›  专栏  ›  技术社区  ›  Roelant M

foreach loop loosing scope中的orderby

  •  2
  • Roelant M  · 技术社区  · 6 年前

    很简单的事情有点麻烦(我希望)

    我正在接收一个用于排序的数组。我为按键选择器创建了一个字典。 但我错过了最后一块 ThenBy 或者每次都重新订购。

    public List<Vehicle> OrderBy(string[] sorting, List<Vehicle> vehicles)
    {
        return Order(sorting, vehicles, SortingFiltersVehicle);
    }
    
    //this is a generic implementation
    private List<T> Order<T>(string[] sorting, List<T> vehicles, IDictionary<string, Func<T, object>> filters)
    {
        if (!sorting.HasAnyValue())
            return vehicles;
    
        foreach (var orderby in sorting)
        {
            var key = orderby.Split("-")[0];
            if (filters.ContainsKey(key.Trim()))
            {
                var direction = orderby.Contains("desc") ? OrderByDirection.Descending : OrderByDirection.Ascending;
                vehicles = vehicles.OrderBy(filters[key], direction).ToList(); <== here is the problem
            }
        }
    
        return vehicles;
    }
    
    private static readonly IDictionary<string, Func<Vehicle, object>> SortingFiltersVehicle = new Dictionary<string, Func<Vehicle, object>>
    {
        { "price", v => v.DiscountedPrice },
        { "make", v => v.Make },
        { "model", v => v.Model },
        { "trimline", v => v.Trimline },
    };
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Marc Gravell    6 年前

    未经测试,但这看起来应该有效:

    private List<T> Order<T>(string[] sorting, List<T> vehicles,
        IDictionary<string, Func<T, object>> filters)
    {
        if (!sorting.Any()) return vehicles;
    
        IOrderedEnumerable<T> sorted = null;
        foreach (var orderby in sorting)
        {
            var key = orderby.Split("-")[0];
            if (filters.ContainsKey(key.Trim()))
            {
                var desc = orderby.Contains("desc");
                var filter = filters[key];
                if (sorted == null) sorted = desc ? vehicles.OrderByDescending(filter) : vehicles.OrderBy(filter);
                else sorted = desc ? sorted.ThenByDescending(filter) : sorted.ThenBy(filter);
            }
        }
    
        return sorted?.ToList() ?? vehicles;
    }