Как оптимально конкатенировать большое количество строк в C#?

«Как оптимально конкатенировать большое количество строк в C#?» — вопрос из категории C# Core, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оптимальный способ зависит от контекста. Основное правило: для динамической конкатенации множества строк в цикле используйте StringBuilder.

1. StringBuilder (лучший выбор для циклов и неизвестного числа операций) Он избегает создания промежуточных строк, работая с изменяемым буфером.

var sb = new StringBuilder();
// Предварительное выделение емкости улучшает производительность
// sb.EnsureCapacity(estimatedFinalLength); 

for (int i = 0; i < 10000; i++)
{
    sb.Append("some string ");
}
string result = sb.ToString();

2. string.Join (лучший выбор для объединения коллекции строк) Эффективен и читаем.

string[] words = { "Hello", "World", "from", "C#" };
string sentence = string.Join(" ", words);

// С современным C# и интерполяцией
string path = string.Join("/", parts); // parts - массив строк

3. Интерполяция строк ($) или сложение (+) для малого, известного числа строк Для 2-5 статических строк это нормально, компилятор оптимизирует.

string name = "John";
string greeting = $"Hello, {name}!"; // Хорошо
string fullName = firstName + " " + lastName; // Хорошо

Почему не обычная конкатенация в цикле? Каждая операция str1 + str2 создает новый строковый объект, так как строки в C# неизменяемы (immutable). Это приводит к квадратичному росту аллокаций памяти и времени выполнения (O(n²)). StringBuilder решает эту проблему, накапливая символы в буфере (O(n) в среднем).

Дополнительная оптимизация: Если конечная длина строки примерно известна, используйте конструктор StringBuilder(int capacity) или метод EnsureCapacity, чтобы минимизировать переаллокации внутреннего буфера.