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

78
demandé sur Max Schilling 2008-10-23 22:54:03

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.

140
répondu Jason Bunting 2014-01-13 13:13:13

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();
38
répondu Ryan Lundy 2008-10-23 19:00:56
[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
répondu marcumka 2008-10-23 19:00:17

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.

3
répondu Michael Meadows 2008-10-23 19:05:23
var _reps = new List(); // with variant data

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
-1
répondu Uhlamurile 2013-03-07 08:14:39