Список <T> в алфавитном порядке

Я использую C# в Framework 3.5. Я хочу быстро отсортировать Generic List<T>. Для этого примера предположим, что у меня есть список типа Person со свойством lastname. Как мне отсортировать этот список с помощью лямбда-выражения?

List<Person> people = PopulateList();
people.OrderBy(???? => ?????)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
463
0
701 230
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

people.OrderBy(person => person.lastname).ToList();

Что ж, это все равно не отражает результат - вам понадобится "List <Person> people =" с левой стороны ...

Marc Gravell 09.10.2008 21:10

Этот ответ демонстрирует наиболее частую ошибку при использовании LINQ-методов, таких как OrderByне, модифицирует список, но вместо этого возвращает новую «коллекцию» (обычно ленивую IEnumerable<T>), которую нужно назначить чему-то.

Alexei Levenkov 31.08.2015 23:41

@AlexeiLevenkov, откуда вы знаете, что это самая частая ошибка при использовании LINQ?

tymtam 02.03.2016 08:58

Вам нужно, чтобы список был отсортирован по месту или просто упорядоченная последовательность содержимого списка? Последнее проще:

var peopleInOrder = people.OrderBy(person => person.LastName);

Для сортировки на месте вам понадобится IComparer<Person> или Comparison<Person>. Для этого вы можете рассмотреть ProjectionComparer в MiscUtil.

(Я знаю, что продолжаю поднимать MiscUtil - он просто остается актуальным ...)

У меня это сработало, но только после того, как я добавил ".ToList ()": contemporariesOrderedByBirthYear = contemporaries.OrderBy (contemp => contemp.BirthYear) .ToList ();

B. Clay Shannon 25.08.2016 21:20

@ B.ClayShannon: Ну, вам это нужно, если вам нужен List<T>, но он вам не нужен, если вы просто хотите итерировать.

Jon Skeet 25.08.2016 23:48
Ответ принят как подходящий

Если вы имеете в виду сортировку на месте (т.е. список обновляется):

people.Sort((x, y) => string.Compare(x.LastName, y.LastName));

Если вы имеете в виду новый список:

var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional

Я считаю, что первый хочет быть people.Sort ((x, y) => string.Compare (x.LastName, y.LastName) <0);

James Curran 09.10.2008 20:56

@ Джеймс: Я бы так не подумал. Comparison <T> возвращает int, а не bool.

Jon Skeet 09.10.2008 20:59

Интересно, хотите ли вы заказать по имени и фамилии ... что вы должны написать?

balexandre 16.04.2009 11:03

var newList = people.OrderBy (x => x.FirstName) .ThenBy (x => x.LastName) .ToList (‌);

Marc Gravell 16.04.2009 11:36

Как отсортировать, если тип данных в int. int.Compare?

user2603796 16.02.2014 22:06

@Faraz просто используйте x.CompareTo (y). Это сложнее для строк, потому что a: nulls и b: разными способами при сортировке строк (чувствительность к регистру, культура и т. д.)

Marc Gravell 16.02.2014 22:07

people.Sort ((x, y) => string.Compare (x.LastName, y.LastName)); Если здесь тип данных int вместо строки ... Тогда как мне отсортировать? people.Sort ((x, y) => int.Compare (x.price, y.price)) ;?

user2603796 16.02.2014 22:11

@Faraz (x, y) => x.price.CompareTo (y.price)

Marc Gravell 16.02.2014 22:18

Cannot convert lambda expression to type 'System.Generic.Collections.IComparer<MySolution.ViewModels.‌​Person>' because it is not a delegate type - это ошибка, которую я получаю в первой.

vapcguy 20.03.2015 03:39

private void SortGridGenerico< T >(
          ref List< T > lista       
    , SortDirection sort
    , string propriedadeAOrdenar)
{

    if (!string.IsNullOrEmpty(propriedadeAOrdenar)
    && lista != null
    && lista.Count > 0)
    {

        Type t = lista[0].GetType();

        if (sort == SortDirection.Ascending)
        {

            lista = lista.OrderBy(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
        else
        {
            lista = lista.OrderByDescending(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
    }
}

у меня этот полезный манекен - Сортировка в общем списке - работал. он поможет вам понять 4 способа (перегрузки) для выполнения этой работы с очень полными и ясными объяснениями и простыми примерами.

  • List.Sort ()
  • List.Sort (общее сравнение)
  • List.Sort (общий IComparer)
  • List.Sort (Int32, Int32, универсальный IComparer)

вы можете использовать linq :), используя:

System.linq;
var newList = people.OrderBy(x=>x.Name).ToList();

Вы можете использовать этот фрагмент кода:

var New1 = EmpList.OrderBy(z => z.Age).ToList();

где New1 - это List<Employee>.

EmpList - это переменная List<Employee>.

z - это переменная типа Employee.

AnshuMan, нет ничего лучше типа var. New1 - это List<Employee>, а z - это Employee.

nawfal 30.05.2013 13:05

Это универсальный сортировщик. Вызывается переключателем ниже.

dvm.PagePermissions - это свойство моей модели ViewModel типа Список T в этом случае T - это класс модели EF6 с именем page_permission.

dvm.UserNameSortDir - это строковое свойство модели просмотра, которое содержит следующее направление сортировки. Тот, который фактически используется в представлении.

switch (sortColumn)
{
    case "user_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.user_name, ref sortDir);
        dvm.UserNameSortDir = sortDir;
        break;
    case "role_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.role_name, ref sortDir);
        dvm.RoleNameSortDir = sortDir;
        break;
    case "page_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.page_name, ref sortDir);
        dvm.PageNameSortDir = sortDir;
        break;
}                 


public List<T> Sort<T,TKey>(List<T> list, Func<T, TKey> sorter, ref string direction)
    {
        if (direction == "asc")
        {
            list = list.OrderBy(sorter).ToList();
            direction = "desc";
        }
        else
        {
            list = list.OrderByDescending(sorter).ToList();
            direction = "asc";
        }
        return list;
    }

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

jalgames 20.07.2014 01:29

Это для сортировки по нескольким столбцам с использованием AngularJS. По сути, это однострочная сортировка, но она также устанавливает переменную направления сортировки. Это действительно не так сложно, если присмотреться. Я предполагаю, что функция сортировки немного пугает из-за всех общих вещей, но если бы я взял это определение, это был бы вызов сортировки в одну строку.

howserss 08.08.2014 18:23

Слишком сложно для того, что требовала Опера. Однако это хорошее решение для другой проблемы.

rolls 26.07.2017 03:19

Вы также можете использовать

model.People = model.People.OrderBy(x => x.Name).ToList();

Хотя этот пример кода может дать ответ на вопрос, ему не хватает объяснения. В его нынешнем виде он не добавляет ценности и выдерживает изменение отрицательного голосования / удаления. Пожалуйста, объясните, что это такое и почему это решение проблемы OP.

oɔɯǝɹ 02.02.2015 13:10

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