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.
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 unIList<T>
- à mon avis, une boucle
for
est plus simple à comprendre que de parcourir la liste en arrière avec une bouclewhile
Il existe d'autres implémentations de brassage avec Fisher-Yates sur Stack Overflow-search et vous en trouverez une assez rapidement.
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
Vous devriez pouvoir utiliser OrderBy
dans LINQ...
var sortedItems = myList.OrderBy(s => s);