111 votes

Trier une liste par ordre alphabétique

J'ai la classe suivante :

class Detail
{
    public Detail()
    {
        _details = new List();
    }
    public IList Details { get { return _details; } }
    private readonly List _details;
}

Actuellement, je trie la classe de manière aléatoire en utilisant ce qui suit :

void ShuffleGenericList(IList list)
{
    // Générer une instance de Random
    var rnd = new Random();
    // Obtenir le nombre d'éléments dans la liste
    var i = list.Count();
    // Avons-nous un type de référence ou un type de valeur
    T val = default(T);

    // Nous allons parcourir la liste à l'envers
    while (i >= 1)
    {
        // Décrémenter notre compteur
        i--;
        // Récupérer l'élément aléatoire suivant de la liste
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        // Commencer à échanger les valeurs
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

Ce que je voudrais faire, c'est trier les contenus de détails par ordre alphabétique.

Par exemple, si les contenus ressemblent à ceci :

[0] a
[1] d
[2] b

Je veux pouvoir exécuter cette méthode et les faire trier comme suit :

[0] a
[1] b
[2] d

Est-ce que quelqu'un sait s'il existe un moyen simple de le faire ? Notez que les listes ont généralement moins de dix éléments. Puis-je le faire avec LINQ ? Désolé mais je ne suis pas très familier avec LINQ, j'ai juste entendu une suggestion selon laquelle je pourrais l'utiliser.

188voto

Jon Skeet Points 692016

Vous pouvez trier une liste en place simplement en appelant List.Sort:

list.Sort();

Cela utilisera l'ordre naturel des éléments, ce qui est correct dans votre cas.

MODIFIER : Notez que dans votre code, vous auriez besoin de

_details.Sort();

car la méthode Sort est uniquement définie dans List, pas dans IList. Si vous devez le trier de l'extérieur où vous n'y avez pas accès en tant que List (vous ne devriez pas le caster car la partie List est un détail d'implémentation), vous devrez faire un peu plus de travail.

Je ne connais pas de tri en place basé sur IList dans .NET, ce qui est un peu étrange maintenant que j'y pense. IList fournit tout ce dont vous auriez besoin, donc cela pourrait être écrit comme une méthode d'extension. Il existe de nombreuses implémentations de quicksort si vous voulez en utiliser une.

Si vous ne vous souciez pas d'un peu d'inefficacité, vous pourriez toujours utiliser :

public void Sort(IList list)
{
    List tmp = new List(list);
    tmp.Sort();
    for (int i = 0; i < tmp.Count; i++)
    {
        list[i] = tmp[i];
    }
}

En d'autres termes, copiez, trie en place, puis copiez la liste triée à nouveau.


Vous pouvez utiliser LINQ pour créer une nouvelle liste qui contient les valeurs originales mais triées :

var sortedList = list.OrderBy(x => x).ToList();

Cela dépend du comportement que vous voulez. Notez que votre méthode de mélange n'est pas vraiment idéale :

  • Créer un nouveau Random à l'intérieur de la méthode rencontre certains des problèmes montrés ici
  • Vous pouvez déclarer val à l'intérieur de la boucle - vous n'utilisez pas cette valeur par défaut
  • Il est plus idiomatique d'utiliser la propriété Count lorsque vous savez que vous travaillez avec un IList
  • À mon avis, une boucle for est plus simple à comprendre que de parcourir la liste à l'envers avec une boucle while

Il y a d'autres implémentations de mélange avec Fisher-Yates sur Stack Overflow - cherchez et vous en trouverez une assez rapidement.

37voto

Damiox Points 542

Il y a deux façons :

Sans LINQ : yourList.Sort();

Avec LINQ : yourList.OrderBy(x => x).ToList()

Vous trouverez plus d'informations dans : https://www.dotnetperls.com/sort

28voto

lahsrah Points 3384

Un autre moyen

_details.Sort((s1, s2) => s1.CompareTo(s2));

13voto

Quintin Robinson Points 41988

Vous devriez pouvoir utiliser OrderBy dans LINQ...

var sortedItems = myList.OrderBy(s => s);

1voto

Oleg Dudnyk Points 628

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X