Come convertire tutte le stringhe in List <string> in lettere minuscole usando LINQ?


94

Ho visto uno snippet di codice ieri in una delle risposte qui su StackOverflow che mi ha incuriosito. Era qualcosa del genere:

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

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

Speravo di poterlo utilizzare per convertire tutti gli elementi di myList in minuscolo. Tuttavia, non succede ... dopo aver eseguito questo, il case in myList è invariato.

Quindi la mia domanda è se esiste un modo, utilizzando le espressioni LINQ e Lambda per scorrere facilmente e modificare il contenuto di un elenco in un modo simile a questo.

Grazie, Max

Risposte:


181

Approccio più semplice:

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

Non molto diverso dal tuo codice di esempio. ForEachripete l'elenco originale mentre ne ConvertAllcrea uno nuovo che è necessario riassegnare.


4
Non è un metodo di estensione.
leppie

@leppie: Vero, non è una buona cattura. In questo caso, preoccuparsi se si tratta di un metodo di istanza o di un metodo di estensione può essere un po 'pedante, ma è decisamente accurato. :)
Jason Bunting

E la stringa è immutabile: P
Sherlock

48

Questo perché ToLower restituisce una stringa minuscola invece di convertire la stringa originale. Quindi vorresti qualcosa del genere:

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();

1
Mi piace questo approccio meglio della risposta accettata perché puoi usarlo con qualsiasi IEnumerable <string>, non solo List <string>.
Joshua Pech

6
Questa soluzione funziona anche in .NET Core, ConvertAll non esiste in .NET Core.
Jonas

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

3

ForEachutilizza Action<T>, il che significa che potresti influenzare xse non fosse immutabile. Poiché xè a string, è immutabile, quindi nulla di ciò che gli fai nel lambda cambierà le sue proprietà. La soluzione di Kyralessa è la tua migliore opzione a meno che tu non voglia implementare il tuo metodo di estensione che ti consenta di restituire un valore sostitutivo.


Per favore, fai altre ricerche se non sei sicuro ... ricordi qualcosa?
Patrick Desjardins,

L'errore è umano, il link che ho fornito aveva 3.5 in grassetto e 2.0 in normale, non l'ho visto. Ho cancellato il mio post ... sarebbe bastato un semplice commento da parte tua. Vuoi downvote senza motivo, come ora supponi.
Patrick Desjardins,

Anche se scrivo questo quasi un anno dopo, e anche se non sono Daok, ti ​​dirò perché la tua risposta è "sbagliata" - hai detto "la soluzione di Kyralessa è la tua migliore opzione" quando non lo è - la mia soluzione è più pulita e più chiaro.
Jason Bunting

-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"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.