2015-04-16 5 views
6

Ich wollte trimmen standardmäßig Leerzeichen und meine zusätzlichen Zeichen. Und ich tat dies durch folgenden Weg:Ist es möglich, Zeichen für String.Trim()?

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

Für mich ist es wie dumm aussieht, weil es mehr Iterationen als es braucht. Ist es möglich, für string.Trim() Zeichen hinzuzufügen (statt Standardwerte zu ersetzen)? Oder wo finde ich eine Reihe von 'Standard-Leerzeichen', die standardmäßig in string.Trim() verwendet werden? Es klingt einfach, aber ich kann es nicht finden.

+0

[Ab .NET Framework 4, trimmt das Verfahren alle white-space Zeichen Unicode (dh Zeichen, die einen echten Rückgabewert erzeugen, wenn sie auf die Char.IsWhiteSpace Methode übergeben werden)] (https: //msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspx). Siehe auch [Wiki: Whitespace-Zeichen] (http://en.wikipedia.org/wiki/Whitespace_character#Unicode) – CodeCaster

+0

@CodeCaster, ich denke, dass Sie den Punkt vermissen, OP möchte vermeiden, mehrere 'Trim'-Aufrufe zu verwenden. – Habib

+0

@Habib Ich antwortete: "Wo finde ich eine Reihe von 'Standard-Leerzeichen'?" _. – CodeCaster

Antwort

10

Es gibt keine Möglichkeit, das Standardverhalten von Trim zu ändern.

Sie können jedoch, wenn Sie müssen, ein Array erstellen, die alle Zeichen enthält, die Sie getrimmt werden sollen, so dass Sie die Anrufe auf nur ein Anruf reduzieren, aber es wäre so etwas wie dieses:

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

Dies wird Ihnen 1 Aufruf Trim:

var result = source.Trim(badChars); 

Im Idealfall würden Sie speichern, dass badChars irgendwo, so dass Sie es nicht bauen müssen, um die ganze Zeit.

Nun, wird dies schneller sein als zwei Anrufe? Ich weiß es nicht, aber ich würde es bei Bedarf messen.

+0

Oder das OP könnte iterieren die Eingabezeichenfolge "source", um die Leerraumzeichen zu finden und sie dann zu entfernen, anstatt für 0 bis 65536 zu gehen. Obwohl die Leistungsdifferenz vernachlässigbar wäre. – Habib

+2

Eine zusätzliche Warnung für vorzeitige Optimierung ist willkommen. Während "Trim(). Trim (additionalChars)" "blöd" klingen mag (OPs Worte), wird das Auffinden dieses Codes in einigen Codebasen dümmer aussehen und die "wtfs pro Minute" definitiv in die Höhe schnellen lassen. Wenn Sie nicht Tausende von Strings pro Sekunde trimmen, werden Sie den Unterschied nicht bemerken. In diesem Fall ist die Lesbarkeit wichtiger. – CodeCaster

+0

Ah, Code in der Frage ist rekursiv, ok. Dann bin ich mir nicht sicher, was ich empfehlen würde. –

1

Es ist nicht möglich, zusätzliche Zeichen direkt hinzuzufügen.

Die Liste der Leerzeichen ist jedoch here in the remarks definiert und Sie können eine statische Hilfeliste aus allen bereitgestellten enums erstellen.

Wenn Sie keine enormen Strings analysieren, lohnt es sich wahrscheinlich nicht, einen zweiten Durchlauf der Zeichenfolge zu speichern.

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