Re[3]: Об эффективности программ
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.10.05 06:27
Оценка:
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.