Сортировать список объектов C# по параметру STRING

У меня есть список ListUser Объекты класса. Мне нужно иметь возможность передавать значение String и порядок по этому столбцу в порядке возрастания или убывания, используя текстовое выражение. Все, что я видел, что использует лямбда-выражения, имеет свойство объекта как строго типизированное значение. Как я могу добиться этого, добавив в качестве параметра "имя по убыванию"?

Код выглядит следующим образом

namespace SortLists
{

  class ListUser
  {
    public int id { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string company { get; set; }
    public string phonenumber { get; set; }
  }

  class Program
  {
     static void Main(string[] args)
     {
        var user1 = new ListUser() { id = 1, firstname = "James", lastname = "Smith", company = "Code Logic", phonenumber = "01235 566 456" };
        var user2 = new ListUser() { id = 1, firstname = "Chris", lastname = "Andrews", company = "Adobe", phonenumber = "01235 566 456" };
        var user3 = new ListUser() { id = 1, firstname = "Paul", lastname = "Jones", company = "Microsoft", phonenumber = "01235 566 456" };
        var user4 = new ListUser() { id = 1, firstname = "Peter", lastname = "Williams", company = "Apple", phonenumber = "01235 566 456" };

        List<ListUser> users = new List<ListUser>()
        {
            user1, user2, user3, user4
        };
    }
  }

3 ответа

Решение

Добавить ссылку на пакет Nuget:
https://www.nuget.org/packages/System.Linq.Dynamic/

  1. добавлять using System.Linq.Dynamic; на вершине.
  2. использование var usersSorted = users.AsQueryable().OrderBy("firstname ASC").ToList();

Это легко с помощью словаря. Просто начните с этого:

var sortBy = new Dictionary<string, Func<IEnumerable<ListUser>, IEnumerable<ListUser>>>()
{
    { "firstname", lus => lus.OrderBy(lu => lu.firstname) },
    { "lastname", lus => lus.OrderBy(lu => lu.lastname) },
    { "company", lus => lus.OrderBy(lu => lu.company) },
    { "phonenumber", lus => lus.OrderBy(lu => lu.phonenumber) },
};

Тогда вы можете легко отсортировать так:

List<ListUser> sorted = sortBy["firstname"](users).ToList();

Если вы хотите, чтобы он по убыванию, просто сделайте это

List<ListUser> sorted = sortBy["firstname"](users).Reverse().ToList();

Просто структурируйте свой метод сортировки следующим образом:

if(stringPassed == "firstname")
{
  List<ListUser> sortedListUser = listUser.OrderBy(p=>p.firstName).ToList();
}
else if(...) // and so on 

если вы хотите заказать их по порядку, просто используйте LINQ .OrderByDescending метод. Другой крутой подход может заключаться в том, что вы устанавливаете ваши свойства как объекты с

string value;
string name;

и зациклите вашу входную строку с отражением свойств вашего класса и получите тот, который вы хотите, и закажите его. Это причудливый способ произвести впечатление на вашего учителя xaxa.

Другие вопросы по тегам