![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильнее?
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]все равно, второй может чуть лучше