Як можна сортувати загальний список 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();
    }
}

Відповіді:


246

З Лінком

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

Без Лінка

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 Якщо ви вважаєте, що відповідь іншого користувача неправильна, вам слід коментувати, голосувати та / або надавати відповідь, яку ви вважаєте правильною, а не редагувати відповідь іншої людини такою, яку ви вважаєте правильною.
Сервіс

24
Я вважаю, що для зменшення порядку використання набагато зрозуміліше, li.Sort((a, b) => b.CompareTo(a));ніж -1*підхід, який використовується тут. Відповідь я змінив відповідно, але @Servy відмінив її.
одного дня, коли

9
@onedaywhen Коли автор помилився, виписавши те, що мав намір, змінивши це на те, що вони мали намір написати, це добре. Зміна форми коду, якою хтось інший вважав, що рішенням має бути використання іншого підходу, який, на вашу думку, слід використовувати замість цього, не є відповідним редагуванням.
Сервіс

5
@onedaywhen Звичайно; ви побачите це де завгодно, де побачите описане редагування. З довідкового центру "Коли мені слід редагувати публікації? [...] Щоб уточнити значення публікації (не змінюючи цього значення)"
Сервіс

4
Або просто -a.CompareTo(b).
Шиммі Вайцхандлер

72

Без Лінка:

Зростання:

li.Sort();

Спад:

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

Sort()це недійсний метод, тож ви не можете Reverse()цим чином зав'язати це. Вам знадобляться дві окремі операції. Однак, за допомогою LINQ ви можете зв'язати це з ланцюжком, OrderByале в цей момент вам слід просто скористатися ним OrderByDescending.
Ахмад Магед


3

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

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

але мої тестові випадки не перевищували часові межі, тому нижче рішення працювало для мене: -

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

Таким чином, в остаточному підсумку робиться висновок, що другий спосіб сортування списку у порядку зменшення дещо швидший, ніж попередній.


-3

Дуже простий спосіб сортування списку зі значеннями int у порядку зменшення:

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

Сподіваюся, що це допомагає!


4
Це не те, int.CompareTo(int)що двері причина. Дивіться джерело на referenceource.microsoft.com, яке говорить: " Необхідно використовувати порівняння, оскільки віднімання призведе до позитивного значення для дуже великих затримок чисел тощо ". Якщо у вас є b = int.MinValueі a = 1(скажіть), це не вдасться. Іноді виклик методу того вартий.
Вай Ха Лі

Питання говорить про загальне сортування списків. "-" операція навіть не компілюється для багатьох типів. А для складеного набору типів ви можете мати числову помилку переповнення, про яку згадувалося в коментарі раніше
Вадим Левковський,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.