Comment convertir toutes les chaînes de la liste < string > en minuscule en utilisant LINQ?
Question
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 myList en minuscules. Cependant, cela n'arrive pas ... après avoir exécuté ceci, le boîtier dans myList est inchangé.
Ma question est donc de savoir s'il existe un moyen, en utilisant les expressions LINQ et Lambda, de facilement parcourir et modifier le contenu d'une liste de la même manière.
Merci, Max
La solution
Approche la plus simple:
myList = myList.ConvertAll(d => d.ToLower());
Pas très différent de votre exemple de code. ForEach
boucle la liste d'origine alors que ConvertAll
en crée une nouvelle que vous devez réaffecter.
Autres conseils
En effet, ToLower renvoie une chaîne en minuscule au lieu de convertir la chaîne d'origine. Donc, vous voudriez quelque chose comme ça:
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
[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");
}
ForEach
utilise Action < T >
, ce qui signifie que vous pourriez affecter x
s'il n'était pas immuable. Puisque x
est une chaîne
, il est immuable, vous ne lui ferez rien dans le lambda qui modifiera ses propriétés. La solution de Kyralessa est votre meilleure option, sauf si vous souhaitez implémenter votre propre méthode d'extension vous permettant de renvoyer une valeur de remplacement.
var _reps = new List(); // with variant data
_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))