Comment puis-je commander une liste <string>?


121

J'ai ceci List<string>:

IList<string> ListaServizi = new List<string>();

Comment puis-je le commander par ordre alphabétique et croissant?




Méthode de tri; en combinaison avec Reverse si vous avez également besoin de descendre
Nathan Q

Réponses:


238
ListaServizi = ListaServizi.OrderBy(q => q).ToList();

@Servy une des raisons d'utiliser OrderBy serait que ListaServizi n'a pas de méthode Sort car elle est déclarée comme IList<string>. Ce code fonctionnerait en fait comme écrit, contrairement aux réponses qui ont reçu plus de votes positifs avec ListaServizi.Sort(). Je ne dis pas que c'est la solution que je choisirais, mais c'était en fait la seule bonne réponse lorsque j'ai publié ma réponse.
phoog

Si ce n'est pas la solution que vous choisiriez, pourquoi la proposer comme réponse? Proposez ce que vous feriez comme réponse; si cela signifie changer le type de IList en List afin que vous puissiez l'appeler .Sort, alors pourquoi ne pas le faire.
Servy

1
@Servy Il a résolu le problème sans changer la spécification du problème. C'est de loin la méthode préférée. De plus, l'énoncé du problème utilise l'interface sur le modèle d'implémentation, ce qui est très important. Proposer le changement de type Liste est correct, mais doit être fait comme une réponse alternative, après la bonne, car cela nécessite de changer le problème.
Aurelien Ribon

1
@ AurélienRibon Rien dans l'énoncé du problème ne dit que le type de la variable ne peut pas être changé. Les exigences sont très spécifiques pour trier un fichier List. Et le coût associé à cette réponse est non négligeable et également inutile. Il ne gagne littéralement rien . Cela ajoute de la complexité au code, c'est moins concis, c'est moins efficace, il n'y a littéralement que des inconvénients ici.
Servy


12

D'autres réponses sont correctes à suggérer Sort, mais elles semblent avoir manqué le fait que l'emplacement de stockage est tapé comme IList<string. Sortne fait pas partie de l'interface.

Si vous savez qu'il ListaServizicontiendra toujours un List<string>, vous pouvez soit changer son type déclaré, soit utiliser un cast. Si vous n'êtes pas sûr, vous pouvez tester le type:

if (typeof(List<string>).IsAssignableFrom(ListaServizi.GetType()))
    ((List<string>)ListaServizi).Sort();
else
{
    //... some other solution; there are a few to choose from.
}

Peut-être plus idiomatique:

List<string> typeCheck = ListaServizi as List<string>;
if (typeCheck != null)
    typeCheck.Sort();
else
{
    //... some other solution; there are a few to choose from.
}

Si vous savez que cela ListaServizicontiendra parfois une implémentation différente de IList<string>, laissez un commentaire et j'ajouterai une suggestion ou deux pour le trier.


5
ListaServizi.Sort();

Fera ça pour vous. C'est assez simple avec une liste de chaînes. Vous devez être un peu plus intelligent si vous triez des objets.


3
ListaServiziest IList<string>; l'interface n'a pas de Sortméthode. Vous avez au moins besoin d'un casting ici.
phoog

3
List<string> myCollection = new List<string>()
{
    "Bob", "Bob","Alex", "Abdi", "Abdi", "Bob", "Alex", "Bob","Abdi"
};

myCollection.Sort();
foreach (var name in myCollection.Distinct())
{
    Console.WriteLine(name + " " + myCollection.Count(x=> x == name));
}

sortie: Abdi 3 Alex 2 Bob 4

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.