Comment puis-je trier les listes génériques DESC et ASC?


110

Comment puis-je trier les listes génériques DESC et ASC? Avec LINQ et sans LINQ? J'utilise 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();
    }
}

Réponses:


246

Avec Linq

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

Sans Linq

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

Notez que sans Linq, la liste elle-même est en cours de tri. Avec Linq, vous obtenez un énumérable ordonné de la liste mais la liste elle-même n'a pas changé. Si vous voulez muter la liste, vous changeriez les méthodes Linq en quelque chose comme

li = li.OrderBy(i => i).ToList();

1
@onedaywhen Si vous pensez que la réponse d'un autre utilisateur est incorrecte, vous devriez commenter, voter et / ou fournir une réponse que vous jugez correcte, et ne pas modifier la réponse d'une autre personne pour qu'elle soit correcte.
Servy le

24
Je pense que pour l'ordre décroissant, il est beaucoup plus clair à utiliser li.Sort((a, b) => b.CompareTo(a));que l' -1*approche utilisée ici. J'ai modifié la réponse en conséquence, mais @Servy l'a annulée.
jour du

9
@onedaywhen Lorsque l'auteur a commis une erreur en écrivant ce qu'il voulait, le changer pour qu'il soit ce qu'il avait l'intention d'écrire est très bien. Changer le code de ce que quelqu'un d'autre pensait que la solution devrait être d'utiliser une approche différente qui, selon vous, devrait être utilisée à la place n'est pas une modification appropriée.
Servy

5
@onedaywhen Sure; vous le verrez partout où vous voyez l'édition décrite. Depuis le centre d'aide, "Quand dois-je modifier les messages? [...] Pour clarifier le sens du message (sans changer ce sens)"
Servy

4
Ou juste -a.CompareTo(b).
Shimmy Weitzhandler

72

Sans Linq:

Ascendant:

li.Sort();

Descendant:

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

Sort()est une méthode void, vous ne pouvez donc pas y enchaîner les Reverse(). Vous aurez besoin de 2 opérations distinctes. Cependant, avec LINQ, vous pouvez le chaîner à un, OrderBymais à ce stade, vous devez simplement l'utiliser à la OrderByDescendingplace.
Ahmad Mageed


3

Je vérifiais toutes les réponses ci-dessus et je voulais ajouter une information supplémentaire. Je voulais trier la liste dans l'ordre DESC et je cherchais la solution qui est plus rapide pour des entrées plus importantes et j'utilisais cette méthode plus tôt: -

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

mais mes cas de test échouaient pour avoir dépassé les délais, donc la solution ci-dessous a fonctionné pour moi: -

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

Donc, en fin de compte, la conclusion est que la 2ème façon de trier la liste par ordre décroissant est un peu plus rapide que la précédente.


-3

Moyen très simple de trier la liste avec des valeurs int dans l'ordre décroissant:

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

J'espère que cela aide!


4
Ce n'est pas ce int.CompareTo(int)qui porte une raison. Voir la source à referencesource.microsoft.com qui dit: " Besoin d'utiliser comparer car la soustraction se terminera en positif pour les très grands nombres négatifs, etc. ". Si vous avez b = int.MinValueet a = 1(dites), cela échouera. Parfois, un appel de méthode en vaut la peine.
Wai Ha Lee

La question parle du tri des listes génériques. L'opération "-" ne compilerait même pas pour de nombreux types. Et pour l'ensemble de types compilé, vous pouvez avoir une erreur de dépassement numérique comme mentionné dans le commentaire précédent
Vadim Levkovsky
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.