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
Odpowiedz
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.
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'. –
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
Mówię o wielkich fragmentach kodu. Próbowałem sprawdzić znaki końcowe, ale zrobiło się nieładnie. – Noich
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;
}
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
Jak to jest związane z 'StringBuilder'? –
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");
}
}
To będzie wymagało ogromnej zmiany w moim kodzie - chcę, aby zmiany były minimalne. Dzięki za próbkę kodu. – Noich
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;
}
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
}
- 1. .NET StringBuilder - sprawdź, czy kończy się ciągiem
- 2. Java: Odczytywanie nowej linii z pliku tekstowego
- 3. Android oczywisty błąd Oczywisty plik nie kończy się z końcowym znakiem nowej linii
- 4. Standardy C++ (koniec nowej linii plików źródłowych)
- 5. Aplikacja C# niespodziewanie się kończy
- 6. Czy wykonywanie javascript kończy się po napotkaniu niepoprawnej linii?
- 7. Uwierzytelnianie linii poleceń mongo kończy się niepowodzeniem.
- 8. Flex: Kiedy tekst zbyt długo włamuje się do nowej linii
- 9. C++ zmienić znak nowej linii z CR + LF na LF
- 10. Dostęp do nowej linii staje się _x000D_
- 11. Jak zmienia się pojemność StringBuilder?
- 12. zapobiec sekcji uicollectionview rozpoczynającej się na nowej linii
- 13. Objective-C - Zamień sekwencje nowej linii na jedną spację
- 14. Newline character in stringbuilder
- 15. Najbardziej Pythonowy sposób na drukowanie nowej linii
- 16. XML - dodawanie nowej linii
- 17. znak nowej linii na obszarze tekstowym
- 18. Powershell Sprawdź, czy tablica w jednej linii
- 19. UNIX: Wymień znak nowej linii w/Colon, zachowując znak nowej linii przed EOF
- 20. Zastępowanie linii nowej sed
- 21. fscanf i znak nowej linii
- 22. Czy jest jakiś znak (naprzeciwko znaku nowej linii)?
- 23. Responsywna komórka tabeli do nowej linii
- 24. Jak mogę sprawdzić, czy ciąg kończy się „.csv” w C
- 25. Czy istnieje sposób na dopasowanie kropki (.) Do nowej linii w wyrażeniach regularnych C++ TR1?
- 26. Odczytywanie pliku bez nowej linii
- 27. Tryb debugowania VSCode zawsze kończy się w pierwszej linii
- 28. druku w nowej linii, Java
- 29. Java: FileWriter: Tworzenie nowej linii
- 30. nowej linii w oknie Immediate
Musisz albo sprawdzić linie/bloki, jak je dodasz - albo zastąpić wszystkie "podwójne nowe linie" pojedynczym i przyciąć koniec. –
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ć. –
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