Как мне отсортировать общий список по DESC и ASC?

110

Как мне отсортировать общий список по DESC и ASC? С LINQ и без LINQ? Я использую VS2008.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}
Penguen
источник

Ответы:

246

С Linq

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Без Linq

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Обратите внимание, что без Linq сортируется сам список. С Linq вы получаете упорядоченное перечисление списка, но сам список не изменился. Если вы хотите изменить список, вы должны изменить методы Linq на что-то вроде

li = li.OrderBy(i => i).ToList();
Энтони Пеграм
источник
1
@onedaywhen Если вы считаете, что ответ другого пользователя неверен, вы должны комментировать, голосовать и / или давать ответ, который, по вашему мнению, является правильным, а не редактировать ответ другого человека, чтобы он был тем, что вы считаете правильным.
Servy
24
Я думаю, что для нисходящего порядка его гораздо проще использовать, li.Sort((a, b) => b.CompareTo(a));чем -1*используемый здесь подход. Я отредактировал ответ соответствующим образом, но @Servy вернул его.
однажды,
9
@onedaywhen Когда автор допустил ошибку при написании того, что он намеревался, можно изменить это так, чтобы оно было тем, что он намеревался написать. Изменение формы кода в том, что, по мнению других, должно заключаться в использовании другого подхода, который, по вашему мнению, следует использовать, не является подходящим редактированием.
Servy 06
5
@onedaywhen Конечно; вы увидите его везде, где вы видите описание редактирования. Из справочного центра: «Когда мне следует редактировать сообщения? [...] Чтобы прояснить значение сообщения (без изменения этого значения)»
Servy
4
Или просто -a.CompareTo(b).
Shimmy Weitzhandler
72

Без Linq:

По возрастанию:

li.Sort();

По убыванию:

li.Sort();
li.Reverse();
Сани Сингх Хуттунен
источник
Sort()- это метод void, поэтому вы не можете привязать Reverse()к нему таким образом. Вам понадобятся 2 отдельные операции. Однако с LINQ вы можете связать его с, OrderByно на этом этапе вы должны просто использовать OrderByDescendingвместо него.
Ахмад Магид
20

без linq используйте Sort()а потом Reverse()его.

Шринивас Редди Татипарти
источник
3

Я проверял весь ответ выше и хотел добавить еще одну дополнительную информацию. Я хотел отсортировать список в порядке DESC, и я искал решение, которое быстрее для больших входов, и я использовал этот метод раньше: -

li.Sort();
li.Reverse();

но мои тестовые примеры терпели неудачу из-за превышения временных ограничений, поэтому для меня сработало следующее решение: -

li.Sort((a, b) => b.CompareTo(a));

Таким образом, в конечном итоге можно сделать вывод, что 2-й способ сортировки списка по убыванию немного быстрее, чем предыдущий.

Sarawgeek
источник
-3

Очень простой способ отсортировать список со значениями int в порядке убывания:

li.Sort((a,b)=> b-a);

Надеюсь, это поможет!

Сунил Мурали
источник
4
Причина не int.CompareTo(int)в этом. См. Источник на сайте linksource.microsoft.com, в котором говорится: « Необходимо использовать сравнение, потому что вычитание приведет к положительному результату для очень больших отрицательных чисел и т . Д. ». Если у вас есть b = int.MinValueи a = 1(скажем), это не удастся. Иногда стоит вызов метода.
Вай Ха Ли
Вопрос касается сортировки общих списков. Операция «-» даже не компилируется для многих типов. А для скомпилированного набора типов у вас может быть ошибка числового переполнения, как упоминалось в комментарии ранее
Вадим Левковский