代码之家  ›  专栏  ›  技术社区  ›  Martin Ongtangco

创建对列表<T>集合排序的泛型方法

  •  0
  • Martin Ongtangco  · 技术社区  · 16 年前

    我以前做的是创建一个case开关,它按以下格式对我的LINQ进行排序:

    List<products> productList = GetAllLists();
    
    switch (sortBy)
    {
      case "name":
         return productsList.OrderBy(pl => pl.Name);
      case "date":
         return productsList.OrderBy(pl => pl.DateCreate);
    }
    

    return SortListCollection(productsList, Name);
    
    4 回复  |  直到 16 年前
        1
  •  3
  •   Dean Harding    16 年前

    你不需要使用反射,你可以使用表达式树,这会快得多。 Here's a blog post 它描述了这个过程,但是剪切粘贴的样本是:

    public static IQueryable<T> SortBy<T>(this IQueryable<T> source, string propertyName)
    {
        var parameter = Expression.Parameter(source.ElementType, String.Empty);
        var property = Expression.Property(parameter, propertyName);
        var lambda = Expression.Lambda(property, parameter);
    
        var methodCallExpression = Expression.Call(typeof(Queryable), "OrderBy",
            new Type[] { source.ElementType, property.Type },
            source.Expression, Expression.Quote(lambda));
    
        return source.Provider.CreateQuery<T>(methodCallExpression);
    }
    
        2
  •  2
  •   LukeH    16 年前

    你…吗 需要 Func<T,TResult> 委托将是快速、灵活的,并且允许运行时检查;传递 string

    var sortedByName = productList.OrderBy(NameSelector);
    var sortedByDate = productList.OrderBy(DateCreatedSelector);
    var sortedByCustom = productList.OrderBy(p => p.SomeOtherProperty);
    
    // ...
    
    // predefined delegates
    public static readonly Func<Product, string> NameSelector = p => p.Name;
    
    public static readonly Func<Product, DateTime> DateCreatedSelector =
                                                         p => p.DateCreated;
    

    当然,如果你愿意,你可以用你自己的方法来包装它,但是这种方法仅仅是包装 OrderBy

        3
  •  1
  •   Martin Ongtangco    16 年前

    private List<T> SortList<T>(List<T> collection, SortOrder order, string propertyName) where T : class
            {
                if (order == SortOrder.Descending)
                {
                    return collection.OrderByDescending(cc => cc.GetType().GetProperty(propertyName).GetValue(cc, null)).ToList();
                }
    
                return collection.OrderBy(cc => cc.GetType().GetProperty(propertyName).GetValue(cc, null)).ToList();
            }
    
        4
  •  0
  •   Alex Reitbort    16 年前

    使用反射构建可以按属性名进行比较的比较器类。然后实例化这个类并将它的compare函数传递给 List.Sort