2008-10-23 13 views
73

J'ai vu un extrait de code hier dans l'une des réponses ici sur StackOverflow qui m'a intrigué. Ce fut quelque chose comme ceci:Comment faire pour convertir toutes les chaînes de la liste <string> en minuscules à l'aide de LINQ?

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

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

J'espérais que je pourrais l'utiliser pour convertir tous les éléments en myList en minuscules. Cependant, cela n'arrive pas ... après avoir exécuté ceci, le boîtier de 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 à celle-ci.

Merci, Max

Répondre

131

approche la plus simple:

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

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

+4

Pas une méthode d'extension. – leppie

+0

@leppie: C'est vrai, ce n'est pas - bonne prise. Dans ce cas, s'inquiéter de savoir s'il s'agit d'une méthode d'instance ou d'une méthode d'extension peut être un peu pédant, mais il est certainement précis. :) –

+0

Et la chaîne est immuable: P – Sherlock

3
[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"); 
} 
34

C'est parce que ToLower retours une chaîne en minuscule 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(); 
+1

J'aime cette approche mieux que la réponse acceptée parce que vous pouvez l'utiliser avec tout IEnumerable , non seulement la liste . –

+5

Cette solution fonctionne également dans .NET Core, ConvertAll n'existe pas dans .NET Core. –

3

ForEach utilise Action<T>, ce qui signifie que vous pouvez affecter x si ce ne sont pas immuables. Puisque x est un string, il est immuable, donc rien de ce que vous faites 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.

+0

S'il vous plaît faire plus de recherches si vous n'êtes pas sûr ... se souvenir de quelque chose? –

+0

Erreur est humaine, le lien que j'ai fourni avait 3,5 en gras et 2,0 en normal, je ne l'ai pas vu. J'ai supprimé mon message ... un simple commentaire de votre part aurait suffi. Vous voulez downvote sans raison, que maintenant supposer. –

+0

Bien que j'écris ceci presque un an plus tard, et bien que je ne sois pas Daok, je vous dirai pourquoi votre réponse est "fausse" - vous avez dit "La solution de Kyralessa est votre meilleure option". et plus clair. –

-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"))