2009-12-22 25 views
8

Tengo una lista de cadenas. Todas las cadenas tienen espacios en blanco que deben convertirse en guiones bajos. Soy completamente capaz de usar un for o foreach loop para hacer esto. Todavía soy relativamente nuevo en C# y me gustaría familiarizarme más con él. Dicho esto, mi pregunta es:C# List <T> .ConvertAll en .NET 2.0

¿Cómo puedo obtener el siguiente código para trabajar en .NET 2.0? Cuando marque fieldList al final de la operación ConvertAll, nada ha cambiado. ¿Hay algún problema con pasar la cadena por valor en lugar de referencia?

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

Por favor, tenga en cuenta, que estoy usando .NET 2.0 y no puedo cambiar la actualidad, por lo que no tienen el lujo de usar LINQ o Lambdas.

Respuesta

13

Es necesario asignar los resultados del método ConvertAll a la variable de la siguiente manera:

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

El método devuelve una nueva ConvertAllList<T> Así que hay que asignar el resultado del método. Si desea volver a utilizar la variable fieldList se puede, pero puede ser mejor para crear una nueva variable para mejorar la claridad de su código:

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

Como señala Marc Gravell en un comentario más abajo, puede simplificar la sintaxis de esta expresión al hacer esto:

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

simplemente para la corrección, puede simplificar a '... ConvertAll (delegado (cadena str) {...});' –

+0

@Marc - bueno señalar :) –

+0

Tengo este error: El tipo los argumentos para el método 'System.Collections.Generic.List.ConvertAll (System.Converter)' no se pueden deducir del uso. Intente especificar los argumentos de tipo explícitamente. – kzh

3

ConvertAll no cambia la lista de entrada. Devuelve una nueva lista que contiene las cosas convertidas. Por cierto, se puede quitar la new Converter<string,string> con C# 2.0 +:

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

Además, nada impide utilizar un compilador de C# 3.0 y LINQBridge y apuntar a .NET 2.0.

+0

Por alguna razón, C# 2.0 no pudo inferir el tipo sin la nueva declaración del convertidor. – kzh