Como converter todas as strings em List <string> para minúsculas usando LINQ?


94

Eu vi um trecho de código ontem em uma das respostas aqui no StackOverflow que me intrigou. Era algo assim:

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

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

Eu esperava poder usá-lo para converter todos os itens de myList em minúsculas. No entanto, isso não acontece ... depois de executar isso, o invólucro em myList não é alterado.

Portanto, minha pergunta é se EXISTE uma maneira, usando expressões LINQ e Lambda, de iterar e modificar facilmente o conteúdo de uma lista de maneira semelhante a esta.

Obrigado, max

Respostas:


181

Abordagem mais fácil:

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

Não muito diferente do seu código de exemplo. ForEachfaz um loop na lista original enquanto ConvertAllcria uma nova que você precisa reatribuir.


4
Não é um método de extensão.
leppie

@leppie: Verdade, não é - boa pegada. Nesse caso, se preocupar se é um método de instância ou um método de extensão pode ser um pouco pedante, mas é definitivamente preciso. :)
Jason Bunting

E a corda é imutável: P
Sherlock

48

Isso ocorre porque ToLower retorna uma string em minúsculas em vez de converter a string original. Então, você quer algo assim:

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

1
Eu gosto mais dessa abordagem do que da resposta aceita porque você pode usar isso com qualquer IEnumerable <string>, não apenas List <string>.
Joshua Pech,

6
Esta solução também funciona no .NET Core, ConvertAll não existe no .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

ForEachusa Action<T>, o que significa que você poderia afetar xse não fosse imutável. Como xé a string, é imutável, portanto, nada que você faça com ele no lambda mudará suas propriedades. A solução da Kyralessa é sua melhor opção, a menos que você queira implementar seu próprio método de extensão que permite retornar um valor de substituição.


Faça mais pesquisas se não tiver certeza ... lembra de algo?
Patrick Desjardins

O erro é humano, o link que forneci tinha 3,5 em negrito e 2,0 em normal, não vi. Eu apaguei minha postagem ... um simples comentário seu teria sido suficiente. Você deseja downvote sem motivo, do que agora supor.
Patrick Desjardins

Embora eu esteja escrevendo isso quase um ano depois, e embora não seja Daok, direi por que sua resposta está "errada" - você disse "A solução de Kyralessa é sua melhor opção" quando não está - minha solução é mais limpa e mais claro.
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"))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.