IEnumerable OrderByDescending vs Reverse () - PullRequest
       11

IEnumerable OrderByDescending vs Reverse ()

0 голосов
/ 27 февраля 2019

У меня есть IEnumerable объектов базы данных, полученных через:

var customers = _dbcontext.Customer.Where(x => x.ClientId > 0 && x.isDeleted == null);
customers = sortCustomers(customers, sortOrder, sortDirection);

Чтобы отсортировать клиентов IEnumerable, у меня есть метод с именем SortCustomers() (реализован ниже), который сопоставляет аргумент sortOrder со свойствомиспользовать для сортировки.Он также использует sortDirection, чтобы определить, использовать ли нисходящее или восходящее направление.

Сначала я использовал orderBy(), который будет восходящим, а затем использовал Reverse() в конечном результате, если было указано нисходящее направление.

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

Использует ли IEnumerable <>. Reverse () делает то же самое, что и OrderByDescending () в этом случае (без отмены отложенной загрузки)?

  • Опция 1:

    private IEnumerable<Customer> sortCustomers(IEnumerable<Customer> unsortedCustomers, string sortOrder, string sortDirection)
    {
        if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.CompanyName.ToString())
        {
            unsortedCustomers = unsortedCustomers.OrderBy(c => c.CompanyName);
        }
        else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.ContactPerson.ToString())
        {
            unsortedCustomers = unsortedCustomers.OrderBy(c => c.ContactPerson);
        }
        else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.EmailId.ToString())
        {
            unsortedCustomers = unsortedCustomers.OrderBy(c => c.EmailId);
        }
        //many more sort properties
    
        //Asc or Desc
        if (sortDirection == VMSortDescriptors.SortDirection.Descending.ToString())
            unsortedCustomers = unsortedCustomers.Reverse();
    
        return unsortedCustomers;
    }
    
  • Опция 2:

    private IEnumerable<Customer> sortCustomers(IEnumerable<Customer> unsortedCustomers, string sortOrder, string sortDirection)
    {
        bool isAscendingOrder = (sortDirection == VMSortDescriptors.SortDirection.Ascending.ToString());
    
        if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.CompanyName.ToString())
        {
            if (isAscendingOrder)
                unsortedCustomers = unsortedCustomers.OrderBy(c => c.CompanyName);
            else
                unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.CompanyName);
        }
        else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.ContactPerson.ToString())
        {
            if (isAscendingOrder)
                unsortedCustomers = unsortedCustomers.OrderBy(c => c.ContactPerson);
            else
                unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.ContactPerson);
        }
        else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.EmailId.ToString())
        {
            if (isAscendingOrder)
                unsortedCustomers = unsortedCustomers.OrderBy(c => c.EmailId);
            else
                unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.EmailId);
        }
        //many more sort properties
    
        return unsortedCustomers;
    }
    

ОБНОВЛЕНИЕ

Что касается сопоставления аргумента sortOrder со свойством, да, я мог бы использовать отражение или что-то еще, чтобы получить значение свойства для элементовв IEnumerable.Я сделал это изначально, с общей функцией сортировки.Но все осложнилось с анонимными результатами.Поэтому я решил пойти просто и прямо.

...