2017-02-02 3 views
1

То, что я пытаюсь сделать этот кодкак SortBy заданного значения списка общего типа

filtered = GetUserList().OrderBy(p => p.Name).ToList(); 

в общем виде

public static List<T> sortBy<T>(string field, List<T>list) 
{ 
    //list.OrderBy(p=>p.Equals(field)).ToList(); 
    //list = list.OrderBy(p => p.GetType().GetProperties().ToList().Find(d => d.Name.Equals(field))).ToList(); 
    return list; 
} 

какие-либо предложения?

+0

В чем проблема с тем, что имеете? – Guy

+0

«общий» может быть неправильным термином здесь. Судя по вашему коду, вы пытаетесь заказать список по свойству, переданному в виде строки. –

+0

Мне нужно сортировать по заданному значению (поле), но каждый раз каждый раз, поэтому мне нужно сделать это в общем виде. поэтому я попытался создать метод sortBy для этой команды, но он не работает. – kostas

ответ

2

Если это ваше требование только, быстрый способ (а не более сложный, который я связал) - это получить доступ к свойствам путем отражения. Этот метод расширения даст вам основы того, что вам нужно:

public static class EnumerablePropertyAccessorExtensions 
{ 
    public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property) 
    { 
     return enumerable.OrderBy(x => GetProperty(x, property)); 
    } 

    private static object GetProperty(object o, string propertyName) 
    { 
     return o.GetType().GetProperty(propertyName).GetValue(o, null); 
    } 
} 

Example on Fiddle

Или (немного оптимизирован), как это:

public static class EnumerablePropertyAccessorExtensions 
{ 
    public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property) 
    { 
     var prop = typeof(T).GetProperty(property); 
     return enumerable.OrderBy(x => GetProperty(x, prop)); 
    } 

    private static object GetProperty(object o, PropertyInfo property) 
    { 
     return property.GetValue(o, null); 
    } 
} 

Example on Fiddle

Этот метод расширения может затем называть IEnumerable<> следующим образом:

filtered = GetUserList().OrderBy("Name").ToList(); 

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

+0

Отличное и простое решение! – Fabjan