создать универсальный метод, который сортирует коллекции List <T> - PullRequest
0 голосов
/ 01 сентября 2010

Я использовал для создания переключателя дел, который сортирует мой 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 ]

3 голосов
/ 01 сентября 2010

Вам не нужно использовать отражение для этого, вы можете сделать это с помощью деревьев выражений, что будет намного быстрее. Вот сообщение в блоге , в котором описывается процесс, но образец вырезанной пасты:

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 голосов
/ 01 сентября 2010

Вам нужно , чтобы передавать строки? Передача делегата 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.

1 голос
/ 01 сентября 2010

Решено:

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();
        }
0 голосов
/ 01 сентября 2010

Используйте отражение, чтобы построить класс сравнения, который можно сравнивать по имени свойства.Затем создайте экземпляр этого класса и передайте его функцию сравнения в List.Sort

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...