2009-12-22 4 views
8

J'ai une liste de chaînes. Toutes les chaînes ont des espaces qui doivent être convertis en caractères de soulignement. Je suis entièrement capable d'utiliser une boucle for ou foreach pour ce faire. Je suis encore relativement nouveau à C# et j'aimerais mieux le connaître. Cela dit, ma question est:C# List <T> .ConvertAll in .NET 2.0

Comment puis-je obtenir le code suivant pour travailler dans .NET 2.0? Lorsque je vérifie fieldList à la fin de l'opération ConvertAll, rien n'a changé. Y at-il un problème avec le passage de la chaîne par valeur au lieu de référence?

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; 
    } 
)); 

S'il vous plaît, gardez à l'esprit, que j'utilise .NET 2.0 et ne peut pas changer actuellement, donc je n'ai pas le luxe d'utiliser LINQ ou lambdas.

Répondre

13

Vous devez affecter les résultats de la méthode ConvertAll à la variable comme ceci:

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

La méthode ConvertAll retourne une nouvelle List<T> vous devez donc affecter le résultat de la méthode. Si vous souhaitez réutiliser la variable fieldList vous pouvez, mais il peut être préférable de créer une nouvelle variable pour améliorer la clarté de votre code:

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

Comme le souligne Marc Gravell dans un commentaire ci-dessous, vous pouvez simplifier la syntaxe de cette expression en faisant ceci:

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

Juste pour être complet, vous pouvez simplifier à '... ConvertAll (délégué (string str) {...});' –

+0

@Marc - Bon à souligner :) Je –

+0

eu cette erreur: Le type arguments pour la méthode 'System.Collections.Generic.List.ConvertAll (System.Converter)' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type. – kzh

3

ConvertAll ne change pas la liste d'entrée. Il renvoie une nouvelle liste contenant les éléments convertis. Soit dit en passant, vous pouvez supprimer le new Converter<string,string> avec C# 2.0+:

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

Par ailleurs, rien ne vous empêche d'utiliser un compilateur C# 3.0 et LINQBridge et cible .NET 2.0.

+0

Pour une raison quelconque, C# 2.0 ne pouvait pas déduire le type sans la nouvelle déclaration Converter. – kzh