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 au hasard en utilisant ce qui suit:

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 de détails dans l'ordre alphabétique.

Par exemple, si le contenu ressemble à ceci:

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

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

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

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

58
demandé sur Ry- 2011-08-06 11:04:30

5 réponses

, Vous pouvez trier une liste de en place de juste 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 de

_details.Sort();

Comme la méthode Sort n'est définie que dans List<T>, pas dans 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 car la partie List<T> est un détail d'implémentation), vous devrez en faire un peu plus travail.

Je ne connais pas de Trie sur place basée sur IList<T> dans.NET, ce qui est légèrement étrange maintenant que j'y pense. IList<T> fournit tout ce dont vous avez besoin, donc pourrait être écrit comme une méthode d'extension. Il y a beaucoup d'implémentations de quicksort si vous voulez en utiliser une.

Si vous ne vous souciez pas d'un peu d'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, copier, trier en place, puis Copier la liste triée arrière.


Vous pouvez utiliser LINQ pour créer une liste new qui contient 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 shuffle n'est pas vraiment idéale:

  • la création d'un nouveau Random dans la méthode se heurte à certains des problèmes présentés ici
  • Vous pouvez déclarer val dans la boucle-vous n'utilisez pas cette valeur par défaut
  • c'est plus idiomatique d'utiliser le Count propriété lorsque vous savoir vous travaillez avec un IList<T>
  • à mon avis, une boucle for est plus simple à comprendre que de parcourir la liste en arrière avec une boucle while

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

118
répondu Jon Skeet 2011-08-06 07:39:50

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

16
répondu Damiox 2011-08-06 07:48:54

Une Autre façon

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
14
répondu lahsrah 2011-08-06 07:59:47

Vous devriez pouvoir utiliser OrderBy dans LINQ...

var sortedItems = myList.OrderBy(s => s);
11
répondu Quintin Robinson 2011-08-06 07:06:32

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

Http://msdn.microsoft.com/en-us/library/3da4abas.aspx

1
répondu Oleg Dudnyk 2011-08-06 07:09:03