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();
    }
}
Penguen
la source

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();
Anthony Pegram
la source
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();
Sani Singh Huttunen
la source
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
20

sans linq, utilisez Sort()et ensuite Reverse().

Srinivas Reddy Thatiparthy
la source
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.

Sarawgeek
la source
-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!

Sunil Murali
la source
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