2008-10-23 3 views
73

Ich sah hier einen Code-Schnipsel gestern in eine der Antworten auf Stackoverflow, die mich fasziniert. Es war so etwas wie dieses:Wie Konvertieren alle Strings in List <string> Fall zu senken, mit LINQ?

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

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

Ich hatte gehofft, ich könnte es benutzen alle Elemente in myList in Kleinbuchstaben zu konvertieren. Es passiert jedoch nicht ... nach dem Ausführen ist das Gehäuse in myList unverändert.

Also meine Frage ist, ob es einen Weg gibt, Ausdrücke mit LINQ und Lambda leicht durchlaufen und den Inhalt einer Liste in einer ähnlichen Weise wie dies zu ändern.

Danke, Max

Antwort

131

einfachste Ansatz:

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

Nicht zu viel anders als Ihr Beispiel-Code. ForEach Schleifen die ursprüngliche Liste während ConvertAll ein neues erstellt, die Sie neu zuweisen müssen.

+4

Keine Erweiterungsmethode. – leppie

+0

@leppie: Stimmt, es ist nicht - guter Fang. In diesem Fall mag es etwas pedantisch sein, sich Gedanken darüber zu machen, ob es sich um eine Instanzmethode oder eine Erweiterungsmethode handelt, aber es ist definitiv richtig. :) –

+0

Und String ist unveränderlich: 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

Das ist, weil ToLower kehrt ein Klein Zeichenfolge anstatt die ursprüngliche Zeichenfolge zu konvertieren. Also würden Sie so etwas wie dies wollen:

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

Ich mag dieser Ansatz besser als die akzeptierte Antwort, weil Sie diese mit jedem IEnumerable , nicht nur Liste verwenden können. –

+5

Diese Lösung funktioniert auch in .NET Core, ConvertAll existiert nicht in .NET Core. –

3

ForEach verwendet Action<T>, was bedeutet, dass Sie x beeinflussen könnte, wenn es nicht unveränderlich waren. Da x ein string ist, ist es unveränderlich, so nichts, was man in dem Lambda es tun wird seine Eigenschaften ändern. Die Lösung von Kyralessa ist die beste Option, es sei denn, Sie möchten Ihre eigene Erweiterungsmethode implementieren, die es Ihnen ermöglicht, einen Ersatzwert zurückzugeben.

+0

Bitte machen Sie mehr Forschung, wenn Sie nicht sicher sind ... sich an etwas erinnern? –

+0

Fehler ist menschlich, der Link, den ich zur Verfügung stellte, hatte 3,5 fett und 2,0 normal, ich habe es nicht gesehen. Ich habe meinen Beitrag gelöscht ... ein einfacher Kommentar von dir wäre genug gewesen. Sie möchten ohne Grund ablehnen, als jetzt annehmen. –

+0

Obwohl ich dies fast ein Jahr später schreibe, und obwohl ich nicht Daok, ich werde Ihnen sagen, warum Ihre Antwort „falsch“ ist - Sie sagte: „Kyralessa-Lösung ist die beste Wahl“, wenn es nicht - meine Lösung ist sauberer und klarer. –

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