У меня есть имя "сортировать по свойству" в строке. Мне нужно будет использовать Lambda / Linq для сортировки списка объектов.
Пример:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Вместо использования множества ifs для проверки имени поля (sortBy), есть ли более чистый способ сортировки
- Сортировка осведомлена о типе данных?
c#
linq
lambda
linq-to-objects
DotnetDude
источник
источник
==
что- то не так ... что?Ответы:
Это можно сделать как
.NET Framework использует лямбду
(emp1,emp2)=>int
какComparer<Employee>.
Это имеет преимущество того, чтобы быть строго напечатанным.
источник
list.sort(functionDeclaredElsewhere)
Одна вещь, которую вы могли бы сделать, это изменить,
Sort
чтобы лучше использовать лямбды.Теперь вы можете указать поле для сортировки при вызове
Sort
метода.источник
Вы можете использовать Reflection, чтобы получить значение свойства.
Где TypeHelper имеет статический метод, такой как:
Вы также можете посмотреть на Dynamic LINQ из библиотеки образцов VS2008 . Вы можете использовать расширение IEnumerable, чтобы преобразовать List в IQueryable, а затем использовать динамическое расширение OrderBy.
источник
collection.ToList().OrderBy(x => TypeHelper.GetPropertyValue( x, sortBy)).ToList();
Вот как я решил свою проблему:
источник
Построение порядка по выражению можно прочитать здесь
Бесстыдно похищенный со страницы в ссылке:
источник
Вы можете использовать отражение для доступа к свойству.
Ноты
источник
Сортировка использует интерфейс IComparable, если тип реализует его. И вы можете избежать ifs, внедрив собственный IComparer:
а потом
источник
Ответ за 1 .:
Вы должны быть в состоянии вручную построить дерево выражений, которое можно передать в OrderBy, используя имя в качестве строки. Или вы можете использовать рефлексию, как предложено в другом ответе, что может быть меньше работы.
Изменить : Вот рабочий пример построения дерева выражений вручную. (Сортировка по X.Value, когда известно только имя «Значение» свойства). Вы можете (должны) создать универсальный метод для этого.
Однако для построения дерева выражений вам необходимо знать конкретные типы. Это может или не может быть проблемой в вашем сценарии использования. Если вы не знаете, по какому типу вы должны сортировать, возможно, будет легче использовать рефлексию.
Ответ за 2 .:
Да, так как Comparer <T> .Default будет использоваться для сравнения, если вы явно не определите компаратор.
источник
Еще один, на этот раз для любого IQueryable:
Вы можете пройти несколько критериев сортировки, например так:
источник
Решение, предоставленное Rashack, к сожалению, не работает для типов значений (int, enums и т. Д.).
Чтобы оно работало с любым типом собственности, я нашел следующее решение:
источник
Добавление к тому, что сделали @Samuel и @bluish. Это намного короче, так как Enum в этом случае не нужен. Плюс в качестве дополнительного бонуса, когда Ascending является желаемым результатом, вы можете передать только 2 параметра вместо 3, поскольку true является ответом по умолчанию для третьего параметра.
источник
Если вы получаете имя столбца сортировки и направление сортировки в виде строки и не хотите использовать переключатель или синтаксис if \ else для определения столбца, то этот пример может быть вам интересен:
Решение основано на использовании словаря, который соединяет необходимый для сортировки столбец через выражение> и его ключевую строку.
источник