89 votes

Comment convertir toutes les chaînes de caractères de List<string> en minuscules en utilisant LINQ ?

J'ai vu un extrait de code hier dans une des réponses ici sur StackOverflow qui m'a intrigué. C'était quelque chose comme ça :

 List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};

 myList.ForEach(d=>d.ToLower());

J'espérais pouvoir l'utiliser pour convertir tous les éléments de maListe en minuscules. Cependant, cela ne se produit pas... après avoir exécuté cette opération, la casse dans myList est inchangée.

Ma question est donc de savoir s'il existe un moyen, en utilisant LINQ et les expressions Lambda, d'itérer et de modifier facilement le contenu d'une liste d'une manière similaire à celle-ci.

Merci, Max

164voto

Jason Bunting Points 27534

L'approche la plus simple :

myList = myList.ConvertAll(d => d.ToLower());

Pas trop de différence avec votre exemple de code. ForEach boucle la liste originale alors que ConvertAll en crée un nouveau que vous devez réaffecter.

45voto

Kyralessa Points 76456

C'est parce que ToLower renvoie à une chaîne en minuscules plutôt que de convertir la chaîne originale. Vous voudriez donc quelque chose comme ça :

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();

3voto

marcumka Points 951
[TestMethod]
public void LinqStringTest()
{
    List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" };
    myList = (from s in myList select s.ToLower()).ToList();
    Assert.AreEqual(myList[0], "abc");
    Assert.AreEqual(myList[1], "hello");
    Assert.AreEqual(myList[2], "goodbye");
}

3voto

Michael Meadows Points 15277

ForEach utilise Action<T> ce qui signifie que vous pourriez affecter x si elle n'était pas immuable. Puisque x est un string Il est immuable, donc rien de ce que vous lui ferez dans le lambda ne changera ses propriétés. La solution de Kyralessa est votre meilleure option, à moins que vous ne souhaitiez implémenter votre propre méthode d'extension qui vous permette de renvoyer une valeur de remplacement.

-1voto

Uhlamurile Points 1
var _reps = new List(); // with variant data

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X