View Full Version : [C#] Rimuovere caratteri illegali da una string
robertino_salemi
01-07-2015, 09:45
Salve a tutti,
devo eseguire il salvataggio di un filename, prima di tale operazione dovrei eseguire la rimozione dei caratteri illegali dal nome del file stesso.
Cercando sul web ho trovato questa funzione LINQ:
Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), "_"));
ho eseguito i dovuti test e funziona egregiamente.
Non ho però ben capito qual è il ruolo della funziona aggregate()
Grazie.
[Kendall]
01-07-2015, 11:38
Salve a tutti,
devo eseguire il salvataggio di un filename, prima di tale operazione dovrei eseguire la rimozione dei caratteri illegali dal nome del file stesso.
Cercando sul web ho trovato questa funzione LINQ:
Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), "_"));
ho eseguito i dovuti test e funziona egregiamente.
Non ho però ben capito qual è il ruolo della funziona aggregate()
Grazie.
Allora, la funzione Aggregate non è in effetti immediatissima da capire.
In pratica Aggregate esegue una serie di iterazioni, una per ogni valore che ottieni da GetInvalidFileNameChars().
fileName è il seme della funzione cioè il valore iniziale della variabile sulla quale aggregate andrà a lavorare.
Questa: (current, c) => current.Replace(c.ToString(), "_") è la funzione che andrà di volta in volta a modificare il seme. Ad ogni successiva iterazione il valore di current sarà quello ottenuto dalla precedente funzione. Ehm, ok, rileggendo non riesco a capirmi neppure io (a volte è davvero difficile spiegare concetti in maniera semplice).
Ti lascio un link, prova a vedere se chiarisce un pò le cose: Aggregate (http://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-13-aggregate/).
tomminno
01-07-2015, 11:41
Aggregate consente di eseguire operazioni su ogni elemento di un IEnumerable, mantenendo il risultato dell'operazione precedente.
Nel caso specifico current indica il valore dell'operazione precedente e c contiene ad ogni iterazione i caratteri in sequenza di Path.GetInvalidFileNameChars(). Il valore iniziale per current è fileName.
Quindi ad ogni iterazione va a sostituire (se lo trova) un carattere non valido per un nome file nella stringa e passa il risultato del replace all'iterazione successiva.
robertino_salemi
01-07-2015, 11:49
Grazie ad entrambi per i preziosi consigli.
Quindi se scrivessi:
Array.ForEach(Path.GetInvalidFileNameChars(), c => file = file.Replace(c.ToString(), String.Empty));
sarebbe la stessa cosa?
Roberto.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.