Perché il mio tentativo di tagliare le stringhe in un elenco < string > non sembra funzionare?
-
03-07-2019 - |
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]
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();
}