Perché il mio tentativo di tagliare le stringhe in un elenco < string > non sembra funzionare?

StackOverflow https://stackoverflow.com/questions/205299

Domanda

Ho provato il seguente codice in LINQPad e ho ottenuto i risultati indicati di seguito:

List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s) 
{ 
  s.Trim(); 
});
listFromSplit.Dump();
  

" un " e " b "

quindi la lettera b non ha rimosso lo spazio bianco come mi aspettavo ...?

Chiunque ha qualche idea

[NOTA: il metodo .Dump () è un'estensione in LINQPad che stampa il contenuto di qualsiasi oggetto in un modo formattato in modo intelligente]

È stato utile?

Soluzione

Il metodo String.Trim () restituisce una stringa che rappresenta la stringa aggiornata. Non aggiorna l'oggetto stringa stesso, ma ne crea uno nuovo.

Puoi farlo:

s = s.Trim();

Tuttavia non è possibile aggiornare una raccolta durante l'enumerazione attraverso di essa, quindi si consiglia di compilare una nuova lista durante l'enumerazione su quella esistente o popolare manualmente la lista utilizzando l'array string restituito da String.Split.

Riempimento di un nuovo elenco:

List<string> temp = new List<string>("a, b".Split(",".ToCharArray()));
List<string> listFromSplit = new List<string>();

temp.ForEach(delegate(string s) 
{ 
    listFromSplit.Add(s.Trim()); 
});

listFromSplit.Dump();

Popolazione manuale:

string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();

foreach (string s in temp)
{
    listFromSplit.Add(s.Trim()); 
};

listFromSplit.Dump();

Altri suggerimenti

stai solo creando una stringa tagliata, senza assegnarle nulla.

var s = "  asd   ";
s.Trim();

non aggiorna s, mentre ..

var s = "   asd   ";
s = s.Trim();

sarà ..

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());

, suppongo, sarebbe come lo farei.

A seguito della risposta pubblicata da Adrian Kuhn potresti fare quanto segue:

var result = listFromSplit.Select(s => s.Trim());

Le istanze di stringa sono immutabili. Tutto ciò che sembra modificarne uno, crea invece una nuova istanza.

Non stai assegnando il risultato tagliato a nulla. Questo è un errore classico, ho appena preso l'abitudine di fare questo errore con string.Replace :)

Non ho IDEA attivo e funzionante, ma questo dovrebbe portare a termine il lavoro (a meno che non mi sbagli):

var result = from each in listFromSplit select each.Trim();

Dividi su entrambi gli spazi e le virgole e rimuovi tutte le voci vuote. Tutto bello e rifinito. Presuppone che le stringhe non contengano spazi, tuttavia.

List<string> listFromSplit =
     new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));

Le opzioni linq fornite da altri dovrebbero funzionare bene. Come altra opzione, ecco un metodo di estensione che utilizza un ciclo for:

    public static void TrimCollection(this IList<string> stringCollection) {

        for (int i = 0; i <= stringCollection.Count() - 1; i++)
            stringCollection[i] = stringCollection[i].Trim();

    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top