2012-12-27 12 views
6

Mam StringBuilder, który gromadzi kod. W niektórych przypadkach ma 2 puste linie między blokami kodu i chciałbym zrobić 1 pustą linię.
Jak mogę sprawdzić, czy aktualny kod ma już pustą linię na końcu? (Wolę nie używać jej metody ToString() z powodu problemów z wydajnością.)C# StringBuilder: Sprawdź, czy kończy się na nowej linii

+0

Musisz albo sprawdzić linie/bloki, jak je dodasz - albo zastąpić wszystkie "podwójne nowe linie" pojedynczym i przyciąć koniec. –

+1

Może użyć Zastąp i zastąp występowanie dwóch środowisk.NewLine za pomocą pojedynczej Environment.NewLine (to na końcu budynku). Inną możliwością jest ToString (długość-1,1), aby uzyskać ostateczną postać. –

+0

Tak właśnie zrobiłem. Został wysłany jako odpowiedź, ale został usunięty, ponieważ ktoś wspomniał, że usunie również podwójne nowe linie w środku kodu. To naprawdę nie ma dla mnie znaczenia, więc jeśli to rozwiązanie zostanie opublikowane jako odpowiedź, zaznaczę to. – Noich

Odpowiedz

-1

Ponieważ ja nie dbam o 2 pustych linii w środku kodu, najprostszym sposobem jest użycie

myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine); 

Ta opcja nie wymaga żadnych zmian w klasach, które korzystają z akumulator kodu.

+0

To nie zadziała, jeśli 'mójKod' nie użyje' Environment.NewLine' jako swojego separatora linii. Ponadto nie jest to bardziej efektywne niż 'ToString'. –

6

można otworzyć dowolny znak swojego StringBuilder z indeksu, jak byś z String.

var sb = new StringBuilder(); 
sb.Append("Hello world!\n"); 
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True 
+0

Mówię o wielkich fragmentach kodu. Próbowałem sprawdzić znaki końcowe, ale zrobiło się nieładnie. – Noich

0

W niektórych przypadkach, posiada 2 pustych linii między bloki kodu, i chciałbym, aby to 1 pusta linia [...] I nie wolą używać jej metody toString() z powodu problemy z wydajnością.

Przede wszystkim należy zadać sobie pytanie, dlaczego istnieją nowe znaki. Jeśli można kontrolować wejście podczas dodawania tekstu można łatwo określić, ile wchodzi się wpisany:

void AddToStringBuilder(string input) 
{ 
    input = input.TrimStart('\r', '\n'); 
    input = input.TrimEnd('\r', '\n'); 

    _stringBuilder.AppendLine(input); 
} 

Albo, jeśli chcesz spojrzeć na uprzednio dodanego części bez wywoływania ToString():

string _previousInput = null; 

void AddToStringBuilder(string input) 
{ 
    if (!String.IsNullOrEmpty(_previousInput) 
     && _previousInput.EnsWith('\n')) 
    { 
     _stringBuilder.Append(input); 
    } 
    else 
    { 
     _stringBuilder.AppendLine(input); 
    } 

    _previousInput = input;  
} 
2

można znormalizować znaki nowej linii, używając regex:

var test = @"hello 

moop 

hello"; 

var regex = new Regex(@"(?:\r\n|[\r\n])+"); 

var newLinesNormalized = regex.Replace(test, Environment.NewLine); 

wyjściowa:

hello 
moop 
hello 
+1

Jak to jest związane z 'StringBuilder'? –

1

Oto pełny przykład.

class string_builder 
{ 
    string previousvalue = null; 
    StringBuilder sB; 
    public string_builder() 
    { 
     sB = new StringBuilder(); 
    } 
    public void AppendToStringBuilder(string new_val) 
    { 
     if (previousvalue.EndsWith("\n") && !String.IsNullOrEmpty(previousvalue)) 
     { 
      sB.Append(new_val); 
     } 
     else 
     { 
      sB.AppendLine(new_val); 
     } 

     previousvalue = new_val; 
    } 

} 
class Program 
{ 

    public static void Main(string[] args) 
    { 
     string_builder sb = new string_builder();    
     sb.AppendToStringBuilder("this is line1\n"); 
     sb.AppendToStringBuilder("this is line2"); 
     sb.AppendToStringBuilder("\nthis is line3\n"); 

    }    
} 
+0

To będzie wymagało ogromnej zmiany w moim kodzie - chcę, aby zmiany były minimalne. Dzięki za próbkę kodu. – Noich

0

W przypadku, gdy ktoś tu kończy, tak jak tutaj, jest to ogólna metoda sprawdzania końca StringBuilder dla dowolnego ciągu znaków z koniecznością użycia na nim ToString.

public static bool EndsWith(this StringBuilder haystack, string needle) 
{ 
    var needleLength = needle.Length - 1; 
    var haystackLength = haystack.Length - 1; 
    if (haystackLength < needleLength) 
    { 
     return false; 
    } 
    for (int i = 0; i < needleLength; i++) 
    { 
     if (haystack[haystackLength - i] != needle[needleLength - i]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
2

Kontrola pojedynczego przewodu. Używa typu string, a nie StringBuilder, ale powinieneś uzyskać podstawowy pomysł.

if (theString.Substring(theString.Length - Environment.NewLine.Length, Environment.NewLine.Length).Contains(Environment.NewLine)) 
{ 
    //theString does end with a NewLine 
} 
else 
{ 
    //theString does NOT end with a NewLine 
} 
Powiązane problemy