web-dev-qa-db-fra.com

Comment convertir toutes les chaînes de la liste <chaîne> en minuscules à l'aide de LINQ?

J'ai vu un extrait de code hier dans l'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 ma liste en minuscules. Cependant, cela ne se produit pas ... après avoir exécuté cela, le boîtier dans myList est inchangé.

Donc, ma question est de savoir s'il existe IS un moyen, en utilisant les expressions LINQ et Lambda pour parcourir facilement et modifier le contenu d'une liste d'une manière similaire à celle-ci.

Merci, Max

83
Max Schilling

Approche la plus simple:

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

Pas trop différent de votre exemple de code. ForEach boucle la liste d'origine tandis que ConvertAll en crée une nouvelle que vous devez réaffecter.

157
Jason Bunting

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

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
42
Ryan Lundy
[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");
}
3
marcumka

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

3
Michael Meadows