2015-04-16 14 views
6

Volevo eseguire il ritaglio in base ai caratteri dello spazio bianco e ai caratteri aggiuntivi. E ho fatto questo modo seguente:È possibile aggiungere caratteri (anziché sostituire i valori di default) per string.Trim()?

string MyTrim(string source) 
{ 
    char[] badChars = { '!', '?', '#' }; 
    var result = source.Trim().Trim(badChars); 
    return result == source 
     ? result 
     : MyTrim(result); 
} 

Per quanto mi riguarda è come sembra stupido, perché ha più iterazioni di cui ha bisogno. È possibile aggiungere caratteri (anziché sostituire i valori di default) per string.Trim()? O dove posso trovare l'array di 'caratteri standard di spazio bianco' che viene utilizzato in string.Trim() per impostazione predefinita? Sembra facile ma non riesco a trovarlo.

+0

[A partire con il .NET Framework 4, il metodo trim tutti i spazi vuoti Unicode (che è, personaggi che producono un valore di ritorno vero quando sono passati al metodo Char.IsWhiteSpace)] (https: //msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspx). Vedi anche [Wiki: Whitespace character] (http://en.wikipedia.org/wiki/Whitespace_character#Unicode) – CodeCaster

+0

@CodeCaster, penso che manchi il punto, OP vuole evitare di usare più chiamate 'Trim'. – Habib

+0

@Habib Stavo rispondendo a _ "dove posso trovare l'array di 'caratteri spazio bianco predefinito'?" _. – CodeCaster

risposta

10

Non è possibile modificare il comportamento predefinito di Trim.

È possibile, tuttavia, se è necessario, creare un array contenente tutti i caratteri che si desidera rifilato in modo che è possibile ridurre le chiamate verso il basso per una sola chiamata, ma sarebbe qualcosa di simile:

var badChars = 
    (from codepoint in Enumerable.Range(0, 65536) 
    let ch = (char)codepoint 
    where char.IsWhiteSpace(ch) 
      || ch == '!' || ch == '?' || ch == '#' 
    select ch).ToArray(); 

Questo vi darà 1 chiamata al Trim:

var result = source.Trim(badChars); 

Idealmente si potrebbe memorizzare che badChars qualche parte in modo non c'è bisogno di costruire tutto il tempo.

Ora, sarà più veloce di due chiamate? Non lo so, ma lo misurerei se necessario.

+0

Oppure l'OP può iterare la stringa di input 'source' per trovare i caratteri dello spazio bianco e quindi rimuoverli, invece di andare da 0 a 65536. Anche se la differenza di prestazioni sarebbe trascurabile. – Habib

+2

Un avviso aggiuntivo per l'ottimizzazione prematura è benvenuto. Mentre 'Trim(). Trim (additionalChars)' può "loop stupido" (parole OP), trovare questo codice in un certo codebase sembrerà più stupido e renderà sicuramente il "wtfs per minuto" alle stelle. A meno che non stiate tagliando migliaia di stringhe al secondo, non noterete la differenza, in tal caso la leggibilità è più importante. – CodeCaster

+0

Ah, il codice nella domanda è ricorsivo, ok. Quindi non sono così sicuro di ciò che consiglierei. –

1

Non è possibile aggiungere direttamente caratteri aggiuntivi.

Tuttavia, l'elenco dei caratteri di spazi vuoti è definito here in the remarks ed è possibile creare un elenco di supporto statico da tutte le enumerazioni fornite.

A meno che non si stiano analizzando stringhe enormi, probabilmente non vale la pena di salvare un secondo passaggio sulla stringa.

0
string MyTrim(string source) 
{ 
    if (_badChars == null) 
     _badChars = Enumerable 
      .Range(0, char.MaxValue) 
      .Cast<char>() 
      .Where(chr => char.IsWhiteSpace(chr) 
         || chr == '!' 
         || chr == '?' 
         || chr == '#') 
      .ToArray(); 

    return source.Trim(_badChars); 
}