Comment convertir toutes les chaînes de la liste en minuscules en utilisant 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 ceci:
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é.
Donc, ma question Est de savoir s'il existe un moyen, en utilisant les expressions LINQ et Lambda, de parcourir et de modifier facilement le contenu d'une liste d'une manière similaire à ce.
Merci, Max
5 réponses
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 alors que ConvertAll
en crée une nouvelle que vous devez réaffecter.
C'est parce que ToLower renvoie une chaîne en minuscules plutôt que de convertir la chaîne d'origine. Donc, vous voudriez quelque chose comme ceci:
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 pourrait affecter x
si ce n'était pas immuable. Puisque x
est un string
, il est immuable, donc rien que vous lui fassiez dans le lambda ne changera ses propriétés. La solution de Kyralessa est votre meilleure option, sauf si vous voulez implémenter votre propre méthode d'extension qui vous permet de retourner 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"))