Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильнее?


delphistorm ©   (2013-07-24 12:19:00) 

Какой из вариантов правильнее?


var
 I: Integer;
 Links: TStringList;
 S: string;
begin
 Links := TStringList.Create;
 // ...

 for I := 0 to Links.Count - 1 do
   S := S + Links[I] + ',';
 Delete(S, Length(S), 1);

 // ...
 Links.Free;
end;



var
 I: Integer;
 Links: TStringList;
 S: string;
begin
 Links := TStringList.Create;
 // ...

 for I := 0 to Links.Count - 1 do
 begin
   S := S + Links[I];
   if I <> Links.Count - 1 then
     S := S + ',';
 end;

 // ...
 Links.Free;
end;


Inovet   (2013-07-24 18:13:00) [1]

> [15] DVM ©   (24.07.13 18:03)
> это обращение сведет на нет выгоду от предварительной установки длины строки

Вот поэтому и спросил.


DVM   (2013-07-24 18:03:00) [2]


> Inovet ©   (24.07.13 16:45) [13]


> SetLength(Rezult, Links.Text.Length - Links.Count);

Нельзя обращаться к Links.Text, это обращение сведет на нет выгоду от предварительной установки длины строки. Надо просто пройтись по первому списку и просуммировать длины всех его элементов, потом прибавить к ним длину разделителей и полученное значение использовать для выделения памяти под результат. Потом перебирая еще раз элементы, будем писать данные в результат с нужным смещением, смещение будем с каждым элементом списка увеличивать на длину элемента списка плюс разделитель.


Sha   (2013-07-24 17:00:00) [3]

> Inovet ©   (24.07.13 16:45) [13]

Я имел в ввиду другое.

Если список длины 1, то результат равен единственной строке списка.

Иначе в первом цикле пройтись по списку и вычислить суммарную длину с учетом разделителей.
Затем во втором цикле переслать данные и разделители в результат с нужным смещением.


Inovet   (2013-07-24 16:45:00) [4]

> [12] Sha ©   (24.07.13 15:29)

Типа

SetLength(Rezult, Links.Text.Length - Links.Count);

?
Это, если концы сток по 2 символа.


Sha   (2013-07-24 15:29:00) [5]

> Как правильнее?

сначала установить нужную длину результирующей строки,
а потом пихать туда данные


Ega23   (2013-07-24 14:10:00) [6]


> Так эта... В Text же концы строк будут, вроде.

А. Ну тогда

if Links.Count = 0 then
 Exit('');
Result := Links[0];
for i := 1 to Links.Count - 1 do
 Result := Result + ',' + Links[i];


Inovet   (2013-07-24 13:25:00) [7]

> [9] Ega23 ©   (24.07.13 13:19)

Так эта... В Text же концы строк будут, вроде.


Ega23   (2013-07-24 13:19:00) [8]

for i := 0 to Links.Count - 2 do
 Links[i] := Links[i] + ',';
Result := Links.Text;


Может и не оптимально, зато наглядно.


RWolf   (2013-07-24 13:11:00) [9]


> [7]

только те, что содержат запятые.


DVM   (2013-07-24 13:05:00) [10]


> S := Links.CommaText;

а каждое значение в кавычки не обернется при этом?


Inovet   (2013-07-24 12:58:00) [11]

> [4] RWolf ©   (24.07.13 12:53)
> S := Links.CommaText;

Вот, точно - есть же сразу с комами.


Inovet   (2013-07-24 12:57:00) [12]

Или так

Links.Delimiter := ','; // Это даже не обязательно
S := Links.DelimitedText;


RWolf   (2013-07-24 12:53:00) [13]

S := Links.CommaText;


Inovet   (2013-07-24 12:51:00) [14]

Или так

if Links.Count > 0 then
begin
 S := Links[0];
 for I := 1 to Links.Count - 1 do
 begin
   S := S + ',' + Links[I];
 end;
end;


DVM   (2013-07-24 12:39:00) [15]

Лучше TStringBuilder использовать для таких вещей если много элементов в Links


DVM   (2013-07-24 12:36:00) [16]

все равно, второй может чуть лучше


Наверх

Титульная страница Поиск, карта сайта Написать письмо