2015-04-16 33 views
6

Chciałem przyciąć domyślnie znaki odstępu i moje dodatkowe znaki. I zrobiłem to, wykonując następujący sposób:Czy jest możliwe dodawanie znaków (zamiast zamiany wartości domyślnych) dla string.Trim()?

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

Jeśli chodzi o mnie, to wygląda na głupią, ponieważ ma więcej iteracji niż potrzebuje. Czy jest możliwe dodawanie znaków (zamiast zamiany wartości domyślnych) dla string.Trim()? Lub gdzie mogę znaleźć tablicę "domyślnych znaków białych znaków", która jest domyślnie używana w string.Trim()? To brzmi łatwo, ale nie mogę go znaleźć.

+0

[Począwszy Framework 4, sposób wykończenia wszystkie Unicode spacje (czyli postacie, które dają się rzeczywistą wartość powrotną gdy są one przekazywane do sposobu Char.IsWhiteSpace)] (https: //msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspx). Zobacz także [Wiki: Whitespace character] (http://en.wikipedia.org/wiki/Whitespace_character#Unicode) – CodeCaster

+0

@CodeCaster, myślę, że brakuje ci punktu, OP chce uniknąć używania wielu wywołań 'Trim'. – Habib

+0

@Habib Odpowiadałem _ "gdzie mogę znaleźć tablicę" domyślnych znaków spacji "?" _. – CodeCaster

Odpowiedz

10

Nie ma możliwości zmiany domyślnego zachowania Trim.

Można jednak, jeśli trzeba utworzyć tablicę zawierającą wszystkie znaki, które mają zostać przycięte tak, że można ograniczyć połączenia do zaledwie jednego połączenia, jednak to byłoby coś takiego:

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

To daje 1 wezwanie do Trim:

var result = source.Trim(badChars); 

Idealnie byłoby przechowywać że badChars gdzieś więc nie trzeba budować go cały czas.

Czy to będzie szybsze niż dwa połączenia? Nie wiem, ale w razie potrzeby zmierzyłbym to.

+0

Lub PO może iterować ciąg wejściowy 'źródło', aby znaleźć białe spacje, a następnie je usunąć, zamiast przechodzić od 0 do 65536. Chociaż różnica wydajności byłaby znikoma. – Habib

+2

Dodatkowe ostrzeżenie przedwczesnej optymalizacji jest mile widziane. Podczas gdy 'Trim(). Trim (additionalChars)' może "zapętlić się głupio" (słowa OP), znalezienie tego kodu w jakiejś części kodu będzie wyglądać bardziej głupio iz pewnością sprawi, że rakieta "wtfs per minute". Jeśli nie przycinacie tysięcy ciągów na sekundę, nie zauważycie różnicy, w takim przypadku ważniejsza jest czytelność. – CodeCaster

+0

Ah, kod w pytaniu jest rekurencyjny, ok. Wtedy nie jestem pewien, co polecam. –

1

Bezpośrednie dodanie dodatkowych znaków nie jest możliwe.

Jednak lista białych znaków jest zdefiniowana jako here in the remarks i można utworzyć statyczną listę pomocników ze wszystkich dostarczonych tabel.

Jeśli nie parsujesz olbrzymich strun, prawdopodobnie nie warto oszczędzać drugiego ciągu na strunie.

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