Hoe te Zetten alle tekenreeksen in de Lijst<string> voor de lagere geval met LINQ?

Ik zag een codefragment gisteren in een van de reacties hier op StackOverflow dat intrigeerde me. Het was iets als dit:

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

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

Ik hoopte dat ik zou kunnen gebruiken om te converteren van alle items in myList naar kleine letters. Echter, het gebeurt niet… na het uitvoeren van deze, de behuizing in myList is ongewijzigd.

Dus mijn vraag is of er een manier IS om, met behulp van LINQ en Lambda expressies te makkelijk doorlopen en wijzigen van de inhoud van een lijst in een op vergelijkbare wijze.

Bedankt,
Max

 

5 Replies
  1. 160

    Eenvoudigste aanpak:

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

    Niet te veel anders uit dan je voorbeeld code. ForEach lussen van de oorspronkelijke lijst overwegende dat ConvertAll creëert een nieuwe die u wilt toewijzen.

    • Niet een extension method.
    • True, het is niet goed te vangen. In dit geval zorgen te maken over of het is een exemplaar methode of een extension method kan een beetje saai, maar het is zeker juist. 🙂
    • En de string is onveranderlijk 😛
  2. 42

    Dat is omdat ToLower geeft een kleine string in plaats van het omzetten van de originele string. Dus je zou iets als dit:

    List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
    • Ik hou van deze aanpak beter is dan het geaccepteerde antwoord, want u kunt deze gebruiken met ieder IEnumerable<string>, niet gewoon een Lijst<string>.
    • Deze oplossing werkt ook in .NETTO-Core, ConvertAll bestaat niet in .NETTO-Core.
  3. 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");
    }
  4. 3

    ForEach gebruikt Action<T>, wat betekent dat u kan van invloed zijn op x als het niet onveranderlijk. Sinds x is een string, het is onveranderlijk, zodat je niets doen om het in de lambda zal u de eigenschappen wijzigen. Kyralessa de oplossing is uw beste optie, tenzij u wilt implementeren van uw eigen extensie methode die u in staat stelt om een vervangende waarde.

    • Houd het doen van meer onderzoek als u niet zeker weet… nog iets?
    • Fout is menselijk, de link die ik had 3.5 in het vet en 2.0 in normaal, ik heb het niet zien. Ik verwijderde mijn post… een simpele reactie van u zou genoeg zijn geweest. U wilt downvote voor geen enkele reden, dan nu wordt aangenomen.
    • Hoewel ik dit schrijf, bijna een jaar later, en hoewel ik niet Daok, ik zal u vertellen waarom uw antwoord is “verkeerd” u zei “Kyralessa de oplossing is uw beste optie” als het niet – mijn oplossing is schoner en duidelijker.
  5. 0
    var _reps = new List(); //with variant data
    
    _reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *