Avatar ·

Лучший способ повторить символ в строке C#

Всем привет! Я новичок в C# и столкнулся с такой задачей: нужно сгенерировать строку, состоящую из повторяющегося символа. Например, мне нужно создать строку из 10 символов "A" — "AAAAAAAAAA". Сейчас я делаю это через цикл: ```csharp string result = ""; for (int i = 0; i < 10; i++) { result += "A"; } ``` Но мне кажется, что это не очень эффективно — ведь строки в C# неизменяемые, и при каждой конкатенации создаётся новый объект. Для больших повторений это, наверное, сильно грузит память и процессор. Я знаю, что есть `StringBuilder`, но может быть есть ещё более простой или производительный способ? В других языках, например в Python, можно написать `"A" * 10`, и всё. Есть ли что-то подобное в C#? Хочется понять: 1. Какой способ самый быстрый? 2. Какой способ самый читаемый и простой для понимания? 3. Есть ли встроенные методы в .NET для этого? Буду благодарен за примеры кода и объяснения. Заранее спасибо! <<>>

Основной способ: метод string.Concat и Enumerable.Repeat

В C# нет оператора умножения для строк, как в Python, но есть несколько элегантных и производительных решений. Самый популярный и рекомендуемый способ — комбинация Enumerable.Repeat и string.Concat:

using System;
using System.Linq;

string result = string.Concat(Enumerable.Repeat('A', 10));
Console.WriteLine(result); // Вывод: AAAAAAAAAA

Этот подход работает начиная с .NET Framework 3.5. Он лаконичен, читаем и использует LINQ, который знаком большинству разработчиков.

Специализированный метод string.Create (для .NET Core 2.1+ и .NET 5+)

Если вам нужна максимальная производительность и вы работаете на современных версиях .NET, используйте string.Create. Этот метод выделяет память под строку и позволяет заполнить её через делегат:

string result = string.Create(10, 'A', (span, ch) => span.Fill(ch));
Console.WriteLine(result); // Вывод: AAAAAAAAAA

Этот способ очень быстрый, так как работает напрямую с памятью (Span<T>) и не создаёт временных объектов.

Классический StringBuilder

Если вы предпочитаете старый добрый StringBuilder, он тоже подходит, особенно когда нужно накапливать строку в несколько этапов:

var sb = new StringBuilder(10);
sb.Append('A', 10);
string result = sb.ToString();
Console.WriteLine(result); // Вывод: AAAAAAAAAA

Обратите внимание на перегрузку Append(char, int) — она специально создана для повторения символа.

Сравнение производительности

Для 10 повторений разница незаметна, но для больших значений (например, 100 000 символов) результаты будут такими (от быстрого к медленному):

  • string.Create — самый быстрый, минимум аллокаций
  • StringBuilder.Append(char, int) — почти так же быстр
  • string.Concat + Enumerable.Repeat — чуть медленнее из-за LINQ
  • Цикл с конкатенацией (+=) — очень медленный, избегайте его для больших строк

Самый простой вариант для новичков

Я рекомендую начинающим использовать string.Concat(Enumerable.Repeat(...)) — он интуитивно понятен и не требует глубоких знаний о Span. Для продакшена с большими объёмами данных — string.Create или StringBuilder.

Также в .NET 6+ появился метод string.PadLeft/PadRight, но он не совсем для этой задачи — он добавляет символы до определённой длины, а не создаёт строку из повторений.

<<>>

Альтернативный подход: конструктор строки через массив char

Ещё один простой способ — создать массив символов нужной длины и инициализировать его:

char[] chars = new char[10];
Array.Fill(chars, 'A');
string result = new string(chars);
Console.WriteLine(result); // AAAAAAAAAA

Этот метод очень нагляден: вы явно создаёте массив, заполняете его и превращаете в строку. Он работает быстро и не требует LINQ. Минус — нужно помнить про создание массива, что даёт дополнительную аллокацию, но для большинства задач это не критично.

Когда использовать

  • Если вы пишете код для .NET Framework (где нет string.Create) — это отличная альтернатива
  • Если нужно заполнить строку разными символами в разных позициях — массив даёт гибкость
  • Для обучения: этот способ помогает понять, как строки связаны с массивами символов

Также можно использовать new string('A', 10) — это конструктор строки, который принимает символ и количество повторений. Этот способ существует с первых версий .NET и является самым коротким!

string result = new string('A', 10);
Console.WriteLine(result); // AAAAAAAAAA

Этот вариант — настоящая находка: он простой, быстрый и не требует дополнительных using. Рекомендую его как основной для повседневных задач.