Самый эффективный способ объединения строк? - PullRequest
255 голосов
/ 22 августа 2008

Какой самый эффективный способ объединения строк?

Ответы [ 17 ]

2 голосов
/ 01 января 2016

Попробуйте это 2 куска кода, и вы найдете решение.

 static void Main(string[] args)
    {
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < 10000000; i++)
        {
            s.Append( i.ToString());
        }
        Console.Write("End");
        Console.Read();
    }

Vs

static void Main(string[] args)
    {
        string s = "";
        for (int i = 0; i < 10000000; i++)
        {
            s += i.ToString();
        }
        Console.Write("End");
        Console.Read();
    }

Вы обнаружите, что 1-й код закончится очень быстро, и память будет в хорошем количестве.

Второй код, возможно, память будет в порядке, но это займет больше времени ... намного дольше. Так что, если у вас есть приложение для большого количества пользователей и вам нужна скорость, используйте 1-й. Если у вас есть приложение на короткое время для одного пользователя, возможно, вы можете использовать оба, или второе будет более «естественным» для разработчиков.

Приветствия.

2 голосов
/ 22 августа 2008

Наиболее эффективным является использование StringBuilder, например:

StringBuilder sb = new StringBuilder();
sb.Append("string1");
sb.Append("string2");
...etc...
String strResult = sb.ToString();

@ jonezy: String.Concat - это хорошо, если у вас есть пара небольших вещей. Но если вы объединяете мегабайты данных, ваша программа, скорее всего, сработает.

1 голос
/ 24 апреля 2014

System.String является неизменным. Когда мы изменяем значение строковой переменной, то новому значению выделяется новая память и освобождается предыдущее распределение памяти. System.StringBuilder был разработан, чтобы иметь концепцию изменяемой строки, в которой различные операции могут выполняться без выделения отдельного места в памяти для измененной строки.

1 голос
/ 19 января 2018

Другое решение:

внутри цикла, используйте список вместо строки.

List<string> lst= new List<string>();

for(int i=0; i<100000; i++){
    ...........
    lst.Add(...);
}
return String.Join("", lst.ToArray());;

это очень очень быстро.

1 голос
/ 31 мая 2011

Это действительно зависит от вашего шаблона использования. Подробный тест между string.Join, string, Concat и string.Format можно найти здесь: String.Format не подходит для интенсивного ведения журнала

(Это фактически тот же ответ, который я дал этому вопросу)

0 голосов
/ 22 августа 2008

Только для двух строк вы определенно не хотите использовать StringBuilder. Существует некоторый порог, выше которого накладные расходы StringBuilder меньше накладных расходов на выделение нескольких строк.

Итак, для более чем 2-3 строк используйте код DannySmurf . В противном случае просто используйте оператор +.

0 голосов
/ 22 августа 2008

Это будет зависеть от кода. Обычно StringBuilder более эффективен, но если вы объединяете только несколько строк и делаете все это в одной строке, оптимизация кода, скорее всего, позаботится об этом за вас. Важно также подумать о том, как выглядит код: для больших наборов StringBuilder облегчит чтение, для маленьких StringBuilder просто добавит ненужный беспорядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...