2009-12-22 7 views
8

Ich habe eine Liste von Zeichenfolgen. Alle Zeichenfolgen haben Leerzeichen, die in Unterstriche konvertiert werden müssen. Ich bin voll in der Lage, eine for oder foreach Schleife zu verwenden, um dies zu tun. Ich bin noch relativ neu in C# und möchte mich damit vertraut machen. Damit ist meine Frage:C# -Liste <T>. ConvertAll in .NET 2.0

Wie kann ich den folgenden Code in .NET 2.0 arbeiten? Wenn ich fieldList am Ende der ConvertAll Operation überprüfe, hat sich nichts geändert. Gibt es ein Problem mit der Übergabe der Zeichenfolge nach Wert anstelle von Referenz?

string fields = 
    "First Name,Middle Name,Last Name,Birth Date,Gender,Address,City,State,Zip,Email"; 
List<string> fieldList = new List<string>(fields.Split(',')); 
fieldList.ConvertAll<string>(new Converter<string, string>(
    delegate(string str) 
    { 
     str = str.Trim(); 
     str = str.Replace(' ', '_'); 
     return str; 
    } 
)); 

Bitte beachten Sie, dass ich .NET 2.0 verwenden und kann derzeit nicht wechseln, so habe mich nicht den Luxus von LINQ oder Lambda-Ausdrücke verwenden.

Antwort

13

Sie müssen die Ergebnisse der ConvertAll Methode auf die Variable wie folgt vergeben:

fieldList = fieldList.ConvertAll<string>(new Converter<string, string>(
    delegate(string str) 
    { 
     str = str.Trim(); 
     str = str.Replace(' ', '_'); 
     return str; 
    } 
)); 

Die ConvertAll Methode gibt ein neues List<T> so müssen Sie das Ergebnis des Verfahrens vergeben. Wenn Sie die fieldList Variable zu wollen, wieder verwenden Sie können, aber es kann besser sein, eine neue Variable zu erstellen, die Klarheit des Codes zu verbessern:

List<String> convertedFieldList 
    = fieldList.ConvertAll<string>(new Converter<string, string>(
     delegate(string str) 
     { 
      str = str.Trim(); 
      str = str.Replace(' ', '_'); 
      return str; 
     } 
)); 

Als Marc GRA unten in einem Kommentar darauf hin, können Sie vereinfachen die Syntax dieses Ausdrucks durch dies zu tun:

List<String> convertedFieldList 
    = fieldList.ConvertAll<String>(delegate(String str) { 
      return str.Trim().Replace(' ', '_'); 
     }); 
+7

Nur der Vollständigkeit halber, können Sie vereinfachen '... ConvertAll (Delegierter (string str) {...});' –

+0

@Marc - Gute darauf hin :) –

+0

habe ich diesen Fehler: Der Typ Argumente für die Methode 'System.Collections.Generic.List.ConvertAll (System.Converter)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben. – kzh

3

ConvertAll nicht die Eingabeliste ändern. Es gibt eine neue Liste zurück, die das umgewandelte Zeug enthält. By the way, können Sie die new Converter<string,string> mit C# entfernen 2.0+:

List<string> converted = fieldList.ConvertAll<string> 
    (delegate(string s) { return s.Trim().Replace(' ', '_'); }); 

Außerdem nichts, was Sie daran hindert, mit einem C# 3.0-Compiler und LINQBridge und .NET 2.0 Ziel.

+0

Aus irgendeinem Grund konnte C# 2.0 den Typ ohne die neue Converter-Deklaration nicht ableiten. – kzh