2009-12-22 10 views
8

Ho una lista di stringhe. Tutte le stringhe hanno spazi bianchi che devono essere convertiti in caratteri di sottolineatura. Sono perfettamente in grado di utilizzare un ciclo for o foreach per eseguire questa operazione. Sono ancora relativamente nuovo in C# e vorrei diventare più familiare con esso. Detto questo, la mia domanda è:C# List <T> .ConvertAll in .NET 2.0

Come posso ottenere il seguente codice per funzionare in .NET 2.0? Quando controllo fieldList alla fine dell'operazione ConvertAll, non è cambiato nulla. C'è un problema con il passaggio della stringa in base al valore anziché al riferimento?

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

prega, tenere a mente, che sto usando .NET 2.0 e non possono attualmente passare, quindi non hanno il lusso di usare LINQ o lambda.

risposta

13

è necessario assegnare i risultati del metodo ConvertAll alla variabile in questo modo:

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

Il metodo ConvertAll restituisce una nuova List<T> quindi è necessario assegnare il risultato del metodo. Se si vuole ri-utilizzare la variabile fieldList è possibile ma può essere meglio per creare una nuova variabile per migliorare la chiarezza del codice:

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

Come sottolinea Marc Gravell in un commento qui sotto, è possibile semplificare la sintassi di questa espressione in questo modo:

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

Solo per completezza, è possibile semplificare al '... ConvertAll (delegato (string str) {...});' –

+0

@ Marc - bene evidenziare :) –

+0

ho ottenuto questo errore: Il tipo gli argomenti per il metodo 'System.Collections.Generic.List.ConvertAll (System.Converter)' non possono essere dedotti dall'utilizzo. Prova a specificare esplicitamente gli argomenti del tipo. – kzh

3

ConvertAll non cambia la lista di input. Restituisce una nuova lista contenente le cose convertite. Tra l'altro, è possibile rimuovere la new Converter<string,string> con C# 2.0 +:

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

Inoltre, nulla impedisce di utilizzare un compilatore C# 3.0 e LINQBridge e di destinazione .NET 2.0.

+0

Per qualche motivo, C# 2.0 non ha potuto inferire il tipo senza la nuova dichiarazione del convertitore. – kzh

Problemi correlati