Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Sinclair, sorry, а не мог бы ты подсказать, как здесь эффективно сконкатенировать все же массив строк при том, что количество их определится в момент конкатенации?
С массивом все вообще просто. См. string.Join.
PD>Твой первый пример хорош, но там жестко 3 строки. На C++ конкатенацию массива строк в новую строку (я имею в виду не string из STL, а char*) я все же напишу однопроходным алгоритмом и при этом не будут использоваться никакие промежуточные буферы. Потому что задача по определению однопроходная.
Это как, интересно?
Не так ли:
public static string Join(IEnumerable<string> strings)
{
int len=0;
foreach(string s in strings)
len+=s.Length;
StringBuilder sb = new StringBuilder(len); // избегаем перевыделений
foreach(string s in strings)
sb.Append(s);
return sb.ToString();
}
?
PD>Здесь это можно, используя только string, а не StringBuilder ?
Можно. Но уволят.
PD>А если использовать StringBuilder, то ведь потом нужно копировать в string и в итоге 2 прохода все же ?
Нет. Там в большинстве случаев никакого копирования нету. UTSL, т.е. Reflector.
Код, который я привел, должен приводить к практически идеальному результату. Можно потестировать, что быстрее — подсчитывать суммарную длину или нет — в зависимости от количества строк в IEnumerable. Но это в любом случае эффекты второго порядка малости.
... << RSDN@Home 1.1.4 stable rev. 510>>