TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #2093 1.9K
День 1723. #ЗаметкиНаПолях
Заменяем Разрывы Строк в C#
Замена разрывов строк в тексте - довольно распространённая задача. Иногда нужно сделать текст в одну строку, либо заменить разрыв строки HTML-элементом <br /> для отображения на веб-сайте. Посмотрим, как это можно сделать.

В C# используются два основных типа разрывов строк:
- \n: символ новой строки, используемый в системах Unix и Linux.
- \r\n: символ возврата каретки в сочетании с символом новой строки, используется в системах Windows.
Рекомендуемый способ записи разрыва строки — использовать Environment.Newline, который преобразуется в \n или \r\n в зависимости от системы.

1. Замена старым способом
Используем метод Replace() класса String:
const string text = 
"This is a line.\rThis is another line.";

var newText = text
.Replace("\r\n", "\n")
.Replace("\r", "\n");

Результат:
This is a line.\nThis is another line.

2. Новый способ
Метод ReplaceLineEndings(), представленный в .NET 6, является более специализированным инструментом для замены разрывов строк и это рекомендуемый подход. Требуется один аргумент: любая строка для строки замены (по умолчанию - Environment.NewLine)
var newText = text.ReplaceLineEndings("\n");

Результат будет таким же, как и в предыдущем способе.

3. Регулярные выражения
Аналогично методу Replace() класса String, можно использовать метод Regex.Replace():
var newText = Regex
.Replace(text, @"(\r\n|\r)", "\n");

И снова, результат будет тем же.

Производительность
Я протестировал производительность всех трёх способов в трёх версиях: .NET6, .NET7 и .NET8.
- string.Replace() примерно постоянен (~30-40нс).
- ReplaceLineEndings() примерно в 3 раза медленнее в .NET6 и .NET7 (~100-130нс), но в .NET8 он стал наоборот быстрее - ~25нс.
- Regex.Replace() примерно в 7 раз медленнее string.Replace() (~240-270нс) в .NET6 и .NET7, в .NET8 стал немного быстрее - ~200нс.

Однако, в .NET7+ для регулярных выражений мы можем использовать кодогенерацию (это даже предлагает сделать IDE):
var newText = MyRegex().Replace(text, "\n");

[GeneratedRegex(@"(\r\n|\r)")]
private static partial Regex MyRegex();
Тогда метод Regex станет быстрее: ~180нс в .NET7 и ~130нс в .NET8.

Памяти все методы используют одинаково – 96 байт.

Источник: https://code-maze.com/csharp-replace-line-breaks-in-a-string/
  • 👍 17
More from @netdeveloperdiary
  1. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  2. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  3. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  4. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  5. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  6. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →