Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.05.04;
Скачать: CL | DM;

Вниз

Как правильнее?   Найти похожие ветки 

 
delphistorm   (2013-07-24 12:19) [0]

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


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;


 
DVM ©   (2013-07-24 12:36) [1]

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


 
DVM ©   (2013-07-24 12:39) [2]

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


 
Inovet ©   (2013-07-24 12:51) [3]

Или так

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


 
RWolf ©   (2013-07-24 12:53) [4]

S := Links.CommaText;


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

Или так

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


 
Inovet ©   (2013-07-24 12:58) [6]

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

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


 
DVM ©   (2013-07-24 13:05) [7]


> S := Links.CommaText;

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


 
RWolf ©   (2013-07-24 13:11) [8]


> [7]

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


 
Ega23 ©   (2013-07-24 13:19) [9]

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


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


 
Inovet ©   (2013-07-24 13:25) [10]

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

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


 
Ega23 ©   (2013-07-24 14:10) [11]


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

А. Ну тогда

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


 
Sha ©   (2013-07-24 15:29) [12]

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

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


 
Inovet ©   (2013-07-24 16:45) [13]

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

Типа

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

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


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

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

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

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

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


 
DVM ©   (2013-07-24 18:03) [15]


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


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

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


 
Inovet ©   (2013-07-24 18:13) [16]

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

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



Страницы: 1 вся ветка

Текущий архив: 2014.05.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1383510603
Юрий
2013-11-04 00:30
2014.05.04
С днем рождения ! 4 ноября 2013 понедельник


2-1374653973
delphistorm
2013-07-24 12:19
2014.05.04
Как правильнее?


15-1383253856
Пит
2013-11-01 01:10
2014.05.04
Мышка слишком быстрая


15-1383622291
Demo
2013-11-05 07:31
2014.05.04
Oracle


15-1383488747
Интересующися
2013-11-03 18:25
2014.05.04
Сдохла справка. D2010, XE5