LINQ kullanarak List <string> içindeki tüm dizeleri küçük harfe nasıl dönüştürebilirim?


96

Dün burada StackOverflow'daki yanıtlardan birinde ilgimi çeken bir kod parçacığı gördüm. Bunun gibi bir şeydi:

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

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

Listemdeki tüm öğeleri küçük harfe dönüştürmek için kullanabileceğimi umuyordum. Ancak, bu gerçekleşmez ... bunu çalıştırdıktan sonra, myList'teki kasa değişmez.

Öyleyse sorum şu: LINQ ve Lambda ifadelerini kullanarak listenin içeriğini buna benzer bir şekilde kolayca yinelemek ve değiştirmek için bir yol var mı?

Teşekkürler Max

Yanıtlar:


188

En kolay yaklaşım:

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

Örnek kodunuzdan çok farklı değil. ForEachorijinal listeyi döngüye sokarken, ConvertAllyeniden atamanız gereken yeni bir liste oluşturur.


4
Bir uzatma yöntemi değil.
leppie

@leppie: Doğru, değil - iyi yakaladım Bu durumda, bunun bir örnek yöntemi mi yoksa bir genişletme yöntemi mi olduğu konusunda endişelenmek biraz bilgiçlikçi olabilir, ancak kesinlikle doğrudur. :)
Jason Bunting

Ve dizi değişmez: P
Sherlock

49

ToLower Çünkü döndüren orijinal dize dönüştürme yerine bir küçük dize. Yani şöyle bir şey istersiniz:

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

1
Bu yaklaşımı kabul edilen cevaptan daha çok seviyorum çünkü bunu sadece List <string> ile değil, herhangi bir IEnumerable <string> ile kullanabilirsiniz.
Joshua Pech

6
Bu çözüm aynı zamanda .NET Core'da da çalışır, ConvertAll .NET Core'da mevcut değildir.
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

ForEachkullanımları Action<T>, yani xdeğişmez değilse etkileyebileceğiniz anlamına gelir . A olduğu xiçin stringdeğişmezdir, dolayısıyla lambda'da ona yapacağınız hiçbir şey özelliklerini değiştirmez. Kyralessa'nın çözümü, bir değiştirme değeri döndürmenize izin veren kendi uzatma yönteminizi uygulamak istemediğiniz sürece en iyi seçeneğinizdir.


Emin değilseniz lütfen daha fazla araştırma yapın ... bir şey hatırlıyor musunuz?
Patrick Desjardins

Hata insan, sağladığım bağlantıda 3.5 kalın ve 2.0 normaldi, görmedim. Yazımı sildim ... sizden basit bir yorum yeterli olurdu. Sebepsiz yere olumsuz oy vermek istiyorsunuz, şimdi tahmin ettiğinizden.
Patrick Desjardins

Bunu neredeyse bir yıl sonra yazmama ve Daok olmasam da, cevabınızın neden "yanlış" olduğunu size söyleyeceğim - değilse "Kyralessa'nın çözümü sizin en iyi seçeneğinizdir" dediniz - benim çözümüm daha temiz ve daha net.
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"))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.