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.
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:
Random
dans la méthode se heurte à certains problèmes affiché icival
à l'intérieur de la boucle - vous n'êtes pas en utilisant cette valeur par défautCount
lorsque vous savez que vous utilisez un IList<T>
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.
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
Autrement
_details.Sort((s1, s2) => s1.CompareTo(s2));
Vous devriez pouvoir utiliser OrderBy
dans LINQ ...
var sortedItems = myList.OrderBy(s => s);
Quel est le problème avec List<T>.Sort()
?