Как указать переданный аргумент, orderby
используя значение, которое я принимаю в качестве параметра?
Пример:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
В настоящее время реализация:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
Вместо того c.Address
, как я могу принять это как параметр?
пример
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
OrderBy
это функция Linq, и она включена, аIEnumerable
не функция, специфичная дляList
. Не стесняйтесь откатывать редактирование или изменять его дальше :)Ответы:
Вот возможность использования отражения ...
источник
ThenBy
метод .Вы можете использовать немного отражения, чтобы построить дерево выражений следующим образом (это метод расширения):
orderByProperty
- это имя свойства, по которому вы хотите упорядочить, и если в качестве параметра передано значение truedesc
, сортировка будет выполняться в порядке убывания; в противном случае выполняется сортировка в порядке возрастания.Теперь вы можете сделать
existingStudents.OrderBy("City",true);
илиexistingStudents.OrderBy("City",false);
источник
Чтобы расширить ответ @Icarus : если вы хотите, чтобы возвращаемый тип метода расширения был IOrderedQueryable вместо IQueryable, вы можете просто привести результат следующим образом:
источник
1) Установите System.Linq.Dynamic
2) Добавьте следующий код
3) Напишите свой переключатель для выбора лямбда-функции
4) Используйте своих помощников
5) Вы можете использовать его с разбивкой по страницам ( PagedList )
Объяснение
System.Linq.Dynamic позволяет нам установить строковое значение в методе OrderBy. Но внутри этого расширения строка будет проанализирована на Lambda. Поэтому я подумал, что сработает, если мы проанализируем Lambda на строку и передадим ее методу OrderBy. И это работает!
источник
источник
Вот кое-что, что я придумал для работы с условным спуском. Вы можете комбинировать это с другими методами
keySelector
динамической генерации функции.Использование:
Обратите внимание, что это позволяет
.OrderBy
связать это расширение с новым параметром с любым IQueryable.источник
Это не позволяет вам пройти
string
, как вы просили в своем вопросе, но это все равно может сработать для вас.OrderByDescending
Метод принимаетFunc<TSource, TKey>
, так что вы можете переписать ваши функции следующим образом:Есть и другие перегрузки,
OrderByDescending
которые принимают aExpression<Func<TSource, TKey>>
и / или aIComparer<TKey>
. Вы также можете изучить их и посмотреть, могут ли они вам пригодиться.источник
Единственное решение, которое сработало для меня, было размещено здесь https://gist.github.com/neoGeneva/1878868 от neoGeneva.
Я повторно опубликую его код, потому что он работает хорошо, и я не хочу, чтобы он терялся в сети!
источник
Добавьте пакет самородков Dynamite в свой код
Добавьте пространство имен Dynamite.Extensions Например: using Dynamite.Extensions;
Упорядочивайте по запросу, как любой SQL-запрос, например: student.OrderBy ("Город DESC, адрес"). ToList ();
источник
Чтобы расширить ответ @Icarus: если вы хотите отсортировать по двум полям, я мог бы выполнить следующую функцию (для одного поля ответ Икария работает очень хорошо).
Это функция, которую тело возвращает для лямбда-выражения, она работает со строкой и int, но достаточно добавить больше типов, чтобы она работала в соответствии с потребностями каждого программиста.
для его использования делается следующее
если есть лучший способ сделать это, было бы здорово, если бы они поделились им
Мне удалось решить эту проблему благодаря: Как я могу сделать лямбда-выражение с несколькими свойствами с помощью Linq
источник
Я опаздываю на вечеринку, но ни одно из этих решений не помогло мне. Мне очень хотелось попробовать System.Linq.Dynamic, но я не смог найти его на Nuget, может быть, обесценился? В любом случае...
Вот решение, которое я придумал. Мне нужно было динамически использовать смесь OrderBy , OrderByDescending и OrderBy> ThenBy .
Я просто создал метод расширения для своего объекта списка, я знаю, немного хакерский ... Я бы не рекомендовал это, если бы это было чем-то, чем я много занимался, но это хорошо для одного случая.
источник