web-dev-qa-db-fra.com

Trier une liste par ordre alphabétique

J'ai la classe suivante:

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

Actuellement, je trie la classe de manière aléatoire en utilisant les éléments suivants:

void ShuffleGenericList<T>(IList<T> list)
{
    //generate a Random instance
    var rnd = new Random();
    //get the count of items in the list
    var i = list.Count();
    //do we have a reference type or a value type
    T val = default(T);

    //we will loop through the list backwards
    while (i >= 1)
    {
        //decrement our counter
        i--;
        //grab the next random item from the list
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        //start swapping values
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

Ce que je voudrais faire est de trier le contenu des détails par ordre alphabétique.

Donc, par exemple, si le contenu ressemble à ceci:

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

Je veux pouvoir exécuter cette méthode et les avoir triés dans:

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

Est-ce que quelqu'un connaît un moyen simple de faire cela? Notez que les listes contiennent généralement moins de dix entrées. Puis-je faire cela avec LINQ? Désolé, mais je ne connais pas très bien LINQ. Je viens d’entendre une suggestion selon laquelle je pourrais l’utiliser.

68
Mariko

Vous pouvez trier une liste sur place simplement en appelant List<T>.Sort :

list.Sort();

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

EDIT: Notez que dans votre code, vous auriez besoin

_details.Sort();

comme la méthode Sort n'est définie que dans List<T>, pas IList<T>. Si vous avez besoin de le trier de l'extérieur où vous n'y avez pas accès en tant que List<T> (Vous ne devriez pas le lancer comme la partie List<T> Est un détail d'implémentation) besoin de faire un peu plus de travail.

Je ne sais pas parmi les tris en place basés sur IList<T> Dans .NET, ce qui est un peu étrange maintenant, je pense maintenant de cela. IList<T> Fournit tout ce dont vous avez besoin, ainsi il pourrait être écrit comme méthode d'extension. Il existe de nombreuses implémentations de tri rapide si vous souhaitez utiliser l'une de celles-ci.

Si vous ne vous souciez pas de l'inefficacité, vous pouvez toujours utiliser:

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

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


Vous pouvez utiliser LINQ pour créer une liste new contenant les valeurs d'origine mais triées:

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

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

  • La création d'un nouveau Random dans la méthode se heurte à certains problèmes affiché ici
  • Vous pouvez déclarer val à l'intérieur de la boucle - vous n'êtes pas en utilisant cette valeur par défaut
  • Il est plus idiomatique d’utiliser la propriété Count lorsque vous savez que vous utilisez un IList<T>
  • Pour moi, une boucle for est plus simple à comprendre que de revenir en arrière dans la liste avec une boucle while

Il existe d'autres implémentations de lecture aléatoire avec Fisher-Yates sur Stack Overflow - recherchez et vous en trouverez une assez rapidement.

134
Jon Skeet

Il y a deux façons:

Sans LINQ: yourList.Sort();

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

Vous trouverez plus d'informations dans: http://www.dotnetperls.com/sort-string-array

21
Damiox

Autrement

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

Vous devriez pouvoir utiliser OrderBy dans LINQ ...

var sortedItems = myList.OrderBy(s => s);
11
Quintin Robinson

Quel est le problème avec List<T>.Sort()?

http://msdn.Microsoft.com/en-us/library/3da4abas.aspx

1
Oleg Dudnyk